4 2 3 2 3 5
1 none 3 4 5
巴什博弈,要求如果可以取胜,那么第一次先手取能取多少才能保证获胜
通过巴什博弈n=(m+1)r+s,我们只要取走s,留下m+1的倍数,那么我们先手总是能赢的。。。根据这个去枚举即可
当n<m时,那么我们只要在大于n小于m的区间内,无论怎么取都能一次取完,先手必胜
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int main() { int t,n,m,i; while(~scanf("%d%d",&n,&m)) { if(n<=m)//n<=m先手必胜 { for(i = n; i<=m; i++) if(i==n) printf("%d",i); else printf(" %d",i); printf("\n"); continue; } if(n%(m+1))//必胜态 { int flag = 0; for(i = 1; i<=m; i++) { if((n-i)%(m+1)==0)//必须留下m+1的倍数 { if(flag == 0) printf("%d",i); else printf(" %d",i); flag++; } } printf("\n"); } else printf("none\n"); } return 0; }