斐波那契数列的余数周期问题
- 斐波那契余数周期性的原理
设
En,k
为斐波那契数列对
k
的余数数列,那么可以得到此数列的递推公式为
En+2,k=(En+1,k+En,k)mod(k)
而前两项肯定为1,并且
En,k
必然会落在
[0,k−1]
之间,如果把每一段在
[0,k−1]
之间的子列划分成单独的部分,那么这每一个单独的部分必然是由此部分的前两项唯一确定的,那么
En,k
在
[0,k−1]
中的排列至多有
k(k−1)
种可能(前两项在
[0,k−1]
中的分布情况),所以
E
必然是有周期的。
- 寻找周期的方法
寻找前两项与E1,k,E2,k相等的部分,那么那部分必然为下一个周期开始的地方
#include<iostream>
using namespace std;
int F(int n)
{
int n1=1,n2=1;
int n3;
if(n==1||n==2) return 1;
for(int i=3;i<=n;i++)
{
n3 = (n1+n2)%2010;
n1 = n2;
n2 = n3;
}
return n3;
}
int main()
{
int first[8],cnt = 7;
for(int i=1;i<=7;i++)
first[i] = F(i);
while(true)
{
if(F(cnt+1)==first[1])
{
if(F(cnt+2)==first[2])
{
cout<<"get:"<<cnt<<endl;
break;
}
}
cnt++;
}
return 0;
}