http://acm.timus.ru/problem.aspx?space=1&num=1180
简单推理博弈。观察每次要取的个数,1,2,4,8,16...,对3的余数分别为1,2,1,2,1...,也就是说,没有可能只用一次操作从一个3的倍数达到另一个3的倍数。
当n=3时,显然先手必胜,那么先手只要在第一次操作上使剩余石子个数为3的倍数即可。这里先手必败的情况只有一种,即n%3==0。
如何求n%3?一个貌似初中或小学就学过的但是大多数人都忘记的东西:对一个数的每一位累加,结果对3的余数与n对3的余数相同。
code:
#include<cstdio>
int main(){
char c ;
int sum = 0 ;
while(~scanf("%c", &c)&&c!='\n') sum += c ;
sum %= 3 ;
if(sum) printf("1\n%d\n", sum) ;
else printf("2\n") ;
return 0 ;}
int main(){
char c ;
int sum = 0 ;
while(~scanf("%c", &c)&&c!='\n') sum += c ;
sum %= 3 ;
if(sum) printf("1\n%d\n", sum) ;
else printf("2\n") ;
return 0 ;}