1 000 000 000 000 000斐波纳契数

时间:2016-09-24 12:57:25

标签: fibonacci

问题是获得1,000,000,000,000,000,000,000斐波那契数字%1,000,000

#include <iostream>
#define fibo(a,b) {long long c=b;b=a;a=(b+c)%1000000;}

using namespace std;

int main(){
    long long a=1,b=0;     //two num
    long long pa,pb,n,k,arr[2][1000];   //last two num,input,input<=2^k
    cin>>n;
    arr[0][0]=n/2;arr[1][0]=n%2;
    for(unsigned long long i=1;n>3;i++){
        arr[0][i]=arr[0][i-1]/2;
        arr[1][i]=arr[0][i-1]%2;
        if(arr[0][i]==1){
            k=i;

            break;
        }
    }
    if(n<=3){      //special occasions
        switch(n){
            case 0:cout<<"0"<<endl;break;
            case 3:cout<<"2"<<endl;break;
            default:cout<<"1"<<endl;
        }
        return 0;
    }
    while(k>=0){   //calc
        pa=a;pb=b;
        a=((pa+pb*2)*pa)%1000000;     //F(2n)=(F(n)+F(n-1)*2)*F(n)
        b=(pa*pa+pb*pb)%1000000;      //F(2n-1)=F(n)^2+F(n-1)^2
        if(arr[1][k--]==1){fibo(a,b);}   //F(n+1)=F(n)+F(n-1)

    }
    cout<<a<<endl;
    return 0;
}

什么时候出错? 为什么这是错的?
我找不到不同的场合。

1 个答案:

答案 0 :(得分:0)

您可以考虑使用的另一种方法是斐波那契数字只有1,000,000个可能的余数,所以如果你要计算前1,000,000个斐波纳契数,那么在某些时候你会发现这些数字会开始出现在一个循环中。因此,请考虑以下方法:

  • 计算前1,000,001个Fibonacci数字。
  • 这些数字最终会进入一个循环。确定进入循环所需的步数k以及循环的持续时间。
  • 通过确定1,000,000,000,000,000,000,000斐波那契数字在该周期中的最终位置(即(1,000,000,000,000,000,000-k)%l)位置,可以找到1,000,000,000,000,000,000,000,000个Fibonacci数,即1,000,000。所以看看那个位置并输出那里的条目。