URAL1180.取石子游戏
1180.取石子游戏
两个Nikifor在玩一个好玩的游戏。
这里有一堆总数为n的石子。
两个Nikifor轮流从石子堆中取石子。
每一个人可以取任意2的非负整数次幂个石子。
取到最后一个石子的人获胜。
你现在写一个程序来判断谁会赢。
输入
一个整数n(n<=10^250)
输出
如果第一个取石子的Nikifor赢那么在第一行输出1,
同时在第二行输出,保证他赢的情况下第一次最少要取的石子数。
如果第二个Nikifor赢,则只输出2。
样例输入
8
样例输出
1
2
【分析】:
当n为三的倍数时,第一个Nikifor一定会输,否则当第一个Nikifor第一次取n mod 3 时一定会赢。
证明:对于n=0,n=1,n=2时,命题显然成立。现证明当对于任意的i(0<=i<=n-1)有命题成立,命题对于n也成立。
当n不是三的倍数时,由于n mod 3一定为2的非负整数次幂,所以当第一个Nikifor第一次取n mod 3 个石子时,一定可以时当前状态变为必败状态,因为对于任意的i(0<=i<=n-1)有命题成立。当n是三的倍数时,由于前面的必败状态m一定是3的倍数,而 n-m 一定含有质因数3,即n-m一定不是2的整数次幂,因此当前的n一定不能变为必败状态,因此,当前的状态为必败状态。
【代码】:
#include<stdio.h>
#include<string.h>
int main()
{
char s[251];
scanf("%s",&s);
int i,sum=0;
for(i=0;i<strlen(s);i++)
sum+=(s[i]-48);//
if(sum%3==0)
printf("2");
else
printf("1\n%d",sum%3);
return 0;
}
转载注明出处:http://blog.youkuaiyun.com/u011400953