题解:P6487 [COCI 2010/2011 #4] HRPA | 斐波那契博弈
斐波那契博弈模版题。用
引理
当
n 为斐波那契数时,若先手不一次取完,则后手可以取到最后一块石子。
证明:
设
若
假设命题对任何小于
设先手第一次取走
综上所述,由第二数学归纳法,原命题成立。
引理
齐肯多夫定理。任何正整数
n 都可以表示成除f_1=1 外的若干个不连续的斐波那契数之和。这样的和式被称为“齐肯多夫表述法”。
证明:
当
假设命题对任何小于
- 若
n 是斐波那契数,则显然命题成立。 - 若
n 不是斐波那契数,设i_0 是满足n>f_{i_0} 的最大正整数。设n^\prime=n-f_{i_0} ,则n^\prime<n ,由归纳假设,n^\prime 可以被表示成除f_1=1 外的若干个不连续的斐波那契数之和,即n^\prime=f_{i_1}+f_{i_2}+\cdots+f_{i_k} ,其中i_1>i_2>\cdots>i_k 为不连续的整数。有f_{i_1}<n^\prime=n-f_{i_0}<f_{i_0+1}-f_{i_0}=f_{i_0-1} ,所以i_1<i_0-1 ,即i_0 和i_1 是不连续的整数。因此n=f_{i_0}+f_{i_1}+f_{i_2}+\cdots+f_{i_k} ,其中i_0>i_1>i_2>\cdots>i_k 为不连续的整数。
综上所述,由第二数学归纳法,齐肯多夫定理对任何正整数
引理
对于一个整数
x\ge2 ,设i 是满足f_i\ge x 的最小正整数。对于任意k\ge i+2 都有2x<f_k 。
证明:
由引理
对于较大的
因此 Mirko 只需先手取完第一堆即可。由引理
因此本题答案即为用齐肯多夫表述法表示
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n;cin>>n;long long lst=0;
while(n>0){
long long a=0,b=1,c=1;//f_0,f_1,f_2
while(c<=n){
c=a+b;
a=b;b=c;
}
n-=a;lst=a;
}
cout<<lst;
return 0;
}
代码中用到了每次取出最大的不大于