斐波那契博弈

std的国庆节结束了,由于疫情,校长决定让同学们分批进校。

​ 至于每批学生来多少人由小蒲和小池负责,两个人轮番负责,需要所有人都可以进校,小蒲学长不想被别人嘲笑自己笨,小池要证明自己比小蒲学长强。所以他们会去争抢安排最后一名同学。

​ 每次安排进校的同学数至少为1,至多为上一次进校的2倍。(请注意第一次安排不能直接安排所有的同学一起回校)。

​ 小池抢到了先手的机会。

​ 请问在两人均操作最优的情况下谁能安排最后一名同学入校。

输入格式:

输入一个整数n,n为需要回学校的同学总数。

输出格式:

如果是小蒲获胜就输出cxk ,小池获胜则输出xhz

输入样例:

3

输出样例:

在这里给出相应的输出。例如:

cxk

样例解释

可以发现小池第一次安排1 个同学或者安排2个同学之后小蒲均可安排最后一个同学返校,因此小蒲会获胜,所以输出cxk即可。

数据范围及约定

2n1×109

 

 

 

结论:当n为斐波那契数的时候,先手必败。

f[i]:1,2,3,5,8,13,21,34,55,89……

所以给出的n为斐波那契数,就输了;否则就赢了。

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int f[100];
    f[0]=1;
    f[1]=2;
    for(int i=2 ; i <= 42 ; i++)//因为n<=1e9,所以是前42个
    {
        f[i] = f[i-1] + f[i-2];
    }
    int n;
    cin>>n;
    int pos = lower_bound(f , f+42 , n) - f;
    if( f[pos] == n)
    {
        cout<<"cxk";
    }else{
        cout<<"xhz";
    }
    return 0;
}

 

posted @ 2023-10-10 22:46  旺旺大菠萝  阅读(1)  评论(0编辑  收藏  举报