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 ;}
posted on 2012-04-27 22:18  追逐.  阅读(230)  评论(0编辑  收藏  举报