poj:http://acm.hdu.edu.cn/showproblem.php?pid=2149
非常经典的巴什博弈,两个人都依次报数,每一个每次可以报1-m的数,把他们两个说的数加起来,谁先加到n(大于等于),谁就赢,两个人都非常地聪明,都想自己能赢。
假设现在有两个人a,b。假设a先数,怎么能确保自己赢呢?第一步该说多少?其实这个n,中间地很多都是无效地,我们可以直接将r =n%(m+1),如果r等于0,那么a一定赢不了,如果r不等于0,那么a一定会赢,为什么?
如果r=0,说明了n为m+1的整数倍,那么不管a数多少,假设a数的数为ai,b只需要数(m-ai+1),最终就能是b一定是先到达这个结果的人,因为n为m+1的整数倍。
如果r!=0,说明n不为m+1的整数倍,那么a第一步只需要数n%(m+1),他就一定能赢,因为n - (n%(m+1))的结果是(m+1)的整数倍,情况就跟上面一样了,只不过上面是a先数,这里因为a先数了n%(m+1),所以剩下的子问题就变成了b先数,所以a肯定会赢
代码实现:
int m,n;
int main()
{
while(~scanf("%d%d",&n,&m)){
if(n%(m+1)==0){
printf("none\n");
}else if(n/(m+1)){
printf("%d\n",n%(m+1));
}else{
// n没有m大的情况
for(int i = n; i <= m; i ++)
{
// 因为这个题对空格有严格要求
if(i == n) printf("%d",i);
else printf(" %d",i);
}
printf("\n");
}
}
return 0;
}