题意:如果可以获胜,问所走最小步数是多少
题解:构造数列,a数组里存的是必败态,如果当前数不在必败态之中,那就看离他最近的必胜态,用一个简单的循环就能找到
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 4000000+1000;
int a[maxn];
int b[maxn];
int main()
{
int ca = 1,t;
scanf("%d",&t);
while(t--)
{
int n,k;
scanf("%d%d",&n,&k);
a[0]= b[0] = 1;
int i,j;
i = j = 0;
while(b[i]<n)
{
i++;
a[i] = b[i-1]+1;
while(a[j+1]*k<a[i])
j++;
if(a[j]*k<a[i])
b[i] = a[i]+b[j];
else
b[i] = a[i];
}
printf("Case %d: ",ca++);
if(a[i] == n)
printf("lose\n");
else
{
int ans;
while(n)
{
if(a[i]<=n)
{
n-=a[i];
ans = a[i];
}
i--;
}
printf("%d\n",ans);
}
}
return 0;
}