URAL 1180 取石子游戏 分析

4 篇文章 0 订阅

 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.csdn.net/u011400953

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值