题意:两人取一堆石子,石子有n个。 先手第一次不能全部取完但是至少取一个。之后每人取的个数不能超过另一个人上一次取的数的K倍。拿到最后一颗石子的赢。先手是否有必胜策略?若有,先手第一步最少取几个? 先来篇论文 再来篇博客(感觉人家讲的比我好,我就不献丑了)
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn=1e6+10; int a[maxn],b[maxn]; int main() { int ncase,Z=0; scanf("%d",&ncase); while(ncase--) { int n,k; scanf("%d%d",&n,&k); a[0]=b[0]=1; int i=0,j=0; while(n>a[i])//构造数列 { i++; a[i]=b[i-1]+1; while(a[j+1]*k<a[i]) j++; if(a[j]*k<a[i]) b[i]=b[j]+a[i]; else b[i]=a[i]; } printf("Case %d: ",++Z); if(a[i]==n) { printf("lose\n"); continue; } int ans; while(n)//减法求先手第一步 { if(n>=a[i]) n-=a[i],ans=a[i]; i--; } printf("%d\n",ans); } }