斐波那契数列的余数周期问题
- 斐波那契余数周期性的原理
设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;
}