思路:
好歹我也是做过一些博弈论的题,结果毫无思路.
因为不能分解成子游戏,所以SG函数直接废.
反正一切线索全部都指向一条唯一的道路--找规律!!(也许是构造?但我太弱)
然后有一个指数级的暴力打表:
#include<cstdio> #include<cstring> #include<cctype> #include<iostream> #include<algorithm> using namespace std; int seq[31],lim; bool Solve(){ int num=0;register int i,j; for(i=1;i<=30;++i)num+=seq[i]; if(num==1)return 0; int tseq[31];memcpy(tseq,seq,sizeof seq); for(i=1;i<=30;++i)for(j=i;j<=30;++j){ memcpy(seq,tseq,sizeof tseq); if(i==j){ if(seq[i]<2||2*i>lim)continue; seq[i]-=2,seq[2*i]++; if(!Solve())return 1; } else{ if(!seq[i]||!seq[j]||i+j>lim)continue; --seq[i],--seq[j],++seq[i+j]; if(!Solve())return 1; } } return 0; } int main(){ register int i,j,k; for(i=1;i<=7;++i){ for(j=1;j<=26;++j){ memset(seq,0,sizeof seq),seq[1]=j;lim=i; if(Solve()==1)printf("lim=%d n=%d %d\n",i,j,j%i); }puts(""); } }
然后好像发现了什么.
然后就是AC程序.
#include<cstdio> #include<cstring> #include<cctype> #include<iostream> #include<algorithm> using namespace std; int main(){ int T;scanf("%d",&T);int n,lim; while(T--){ scanf("%d%d",&n,&lim); if(lim==1)puts("1"); else if(n==1)puts("1"); else if(n<=lim){ if(n&1)puts("1");else puts("0"); } else if(lim==2){ if(n%4==2||n%4==3)puts("0");else puts("1"); } else{ if(lim&1){ if(n%lim!=0&&(n%lim)%2==0)puts("0");else puts("1"); } else{ int t=n%lim; if(t==0){ if((n/lim)&1)puts("0");else puts("1"); } else if(t&1){ if(n%(2*lim)==lim+t)puts("0");else puts("1"); } else{ if(n%(2*lim)==t)puts("0");else puts("1"); } } } } return 0; }