标签:
在“1250 Fibonacci数列”中,我们求出了第n个Fibonacci数列的值。但是1250中,n<=109。现在,你的任务仍然是求出第n个Fibonacci数列的值,但是注意:n为整数,且1 <= n <= 100000000000000
输入有多组数据,每组数据占一行,为一个整数n(1 <= n <= 100000000000000)
输出若干行。每行输出第(对应的输入的)n个Fibonacci数(考虑到数会很大,mod 1000000007)
3
4
5
2
3
5
1 <= n <= 100000000000000
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define ll long long const ll mod=1000000007; ll a[2][2],b[2][2],c[2][2]; int main(){ ll n; while(scanf("%lld",&n)==1){ if(n==1){puts("1");continue;} if(n==2){puts("1");continue;} if(n==3){puts("2");continue;} n-=3; a[0][0]=1;a[0][1]=1;a[1][0]=1;a[1][1]=0; b[0][0]=1;b[0][1]=1;b[1][0]=1;b[1][1]=0; while(n){ if(n&1){ c[0][0]=(a[0][0]*b[0][0]%mod+a[0][1]*b[1][0]%mod)%mod; c[0][1]=(a[0][0]*b[0][1]%mod+a[0][1]*b[1][1]%mod)%mod; c[1][0]=(a[1][0]*b[0][0]%mod+a[1][1]*b[1][0]%mod)%mod; c[1][1]=(a[1][0]*b[0][1]%mod+a[1][1]*b[1][1]%mod)%mod; memcpy(a,c,sizeof c); } c[0][0]=(b[0][0]*b[0][0]%mod+b[0][1]*b[1][0]%mod)%mod; c[0][1]=(b[0][0]*b[0][1]%mod+b[0][1]*b[1][1]%mod)%mod; c[1][0]=(b[1][0]*b[0][0]%mod+b[1][1]*b[1][0]%mod)%mod; c[1][1]=(b[1][0]*b[0][1]%mod+b[1][1]*b[1][1]%mod)%mod; memcpy(b,c,sizeof c); n>>=1; } printf("%lld\n",(a[0][0]+a[0][1])%mod); } return 0; }
标签:
原文地址:http://www.cnblogs.com/shenben/p/5879177.html