杭电3951

来源:互联网 发布:数控车床编程怎么取消n 编辑:程序博客网 时间:2024/05/13 13:32

这道题是中文题,大家理解我就不讲了,这里就是有一个圈,然后后面的人最多可以取1—k个,与原来不同的是这里的是一个圈,而且你取的硬币是需要连在一起的,那么这时候我们就知道第一个人取走之后(假设没有取完,完了就赢了),第二个人就面对的是一排石子,而且他也是只能取1—k个,还是连续的,那么他应该怎么办么?要想赢,你可能想到将这时候的局面转变为sg=0的局面,完全正确。但是怎么实施,在博弈之中一直有一个技巧,就是只要双边的取法是平等的(不平等的比如后面的可以取你的双倍),那么我们就可以营造出一种局面。什么局面?就是你取完之后,剩下的堆数数偶数,并且有成对的堆的数量是相等的,这时候无论对方采取什么策略,你都可以采取同样的策略,这是必赢的,那么作为第二取的人,我们能不能做到这样?可以。假设k=1,那就是只能取一个,那就是看你的时候是基数还是偶数。假设不是1.那么这时候剩下的石子数量不是基数就是偶数(假设不为0),那么你可以取1—k,这时k>=2我们可以取和剩下堆数情况相同(基数或偶数),来是的剩下的数量是偶数,并且是两堆,这时候第一取的人必败,那么有了这一点,后面的就好办了。

下面提供一个代码:

#include<iostream>using namespace std;int main(){    int m;    cin>>m;    int N,k;    int i=0;    while(m--)    {        cin>>N>>k;        i++;        cout<<"Case "<<i<<": ";        if(k==1)            if(N%2==0)                cout<<"second"<<endl;            else cout<<"first"<<endl;        else        {             if(N<=k&&k>=2)            cout<<"first"<<endl;             else cout<<"second"<<endl;         }            }    return 0;}

0 0