巴什博弈,要求如果可以取胜,那么第一次先手取能取多少才能保证获胜
通过巴什博弈n=(m+1)r+s,我们只要取走s,留下m+1的倍数,那么我们先手总是能赢的。。。根据这个去枚举即可
有3种情况:
当n<m时,那么我们只要在大于n小于m的区间内,无论怎么取都能一次取完,先手必胜
当n=m时,只要我们m是n+1的倍数,先手就不取,那他就必胜
当n>m时,先手只要取m和n之间的数字,包括n,m,就一定能胜;
代码如下:
#include<iostream> #include<cstdio> using namespace std; int main() { int m,n,a,b,i,f; while(scanf("%d %d",&m,&n)!=EOF) { if(m<n) { for(i=m;i<n;i++) { printf("%d ",i); } printf("%d\n",n); } else if(m==n) printf("%d\n",m); else if(m>n) { if(m%(n+1)==0) cout<<"none"<<endl; else { a=n+1; b=m-a; if(b>n) { f=m%(n+1); cout<<f<<endl; } else cout<<b<<endl; } } } return 0; }