斐波那契博弈
std的国庆节结束了,由于疫情,校长决定让同学们分批进校。
至于每批学生来多少人由小蒲和小池负责,两个人轮番负责,需要所有人都可以进校,小蒲学长不想被别人嘲笑自己笨,小池要证明自己比小蒲学长强。所以他们会去争抢安排最后一名同学。
每次安排进校的同学数至少为1,至多为上一次进校的2倍。(请注意第一次安排不能直接安排所有的同学一起回校)。
小池抢到了先手的机会。
请问在两人均操作最优的情况下谁能安排最后一名同学入校。
输入格式:
输入一个整数n,n为需要回学校的同学总数。
输出格式:
如果是小蒲获胜就输出cxk ,小池获胜则输出xhz
输入样例:
3
输出样例:
在这里给出相应的输出。例如:
cxk
样例解释
可以发现小池第一次安排1 个同学或者安排2个同学之后小蒲均可安排最后一个同学返校,因此小蒲会获胜,所以输出cxk即可。
数据范围及约定
2≤n≤1×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; }