题目大意

A和B两个人在玩一个游戏,这个游戏是他们轮流操作一对整数(x,y)。
初始时(x,y)=(1,0),可以进行三种操作:

  1. 将(x,y)变成(1,x+y)。
  2. 将(x,y)变成(2x,y)。
  3. 将(x,y)变成(3x,y)。
    给定正整数n (n<=30,000),如果x+y>=n时就不能进行后两种操作。
    如果某个人操作后y>=n,他就输掉了

分析

当一个人操作前x+y>=n时,他就输掉了
博弈论问题的一般方法
可以是操作后变成一个子问题
此题中每次操作相当于减少离n的距离
我们考虑dp
dp[i][j][k]表示y离n还有i,\(x=2^j*3^k\),是否必胜

做法

交互题
获得对面操作后,就直接执行对面操作
轮到自己,就选择一个让对手必败的操作

solution

for(i=1;i<=n;i++)
for(j=20;j>=0;j--)
for(k=20;k>=0;k--){
	if(p2[j]*p3[k]>=i) f[i][j][k]=0;
    else{
		if(!f[i][j+1][k]||!f[i][j][k+1]||!f[i-p2[j]*p3[k]][0][0]) f[i][j][k]=1;
        else f[i][j][k]=0;
    }
}

相关文章:

  • 2021-07-05
  • 2022-12-23
  • 2021-10-15
  • 2021-10-24
  • 2021-08-01
  • 2022-01-24
  • 2021-10-26
  • 2021-10-07
猜你喜欢
  • 2022-02-04
  • 2021-05-20
  • 2021-11-14
  • 2021-11-04
  • 2021-08-14
  • 2022-12-23
  • 2022-01-15
相关资源
相似解决方案