洛谷 P1962 斐波那契数列
P1962 斐波那契数列
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 LL a[2][2],b[2][2],c[2][2],p; 5 #define mod 1000000007 6 7 void mi(LL x[2][2],LL y[2][2]) 8 { 9 memset(c,0,sizeof(c)); 10 for(int i=0;i<=1;i++) 11 for(int j=0;j<=1;j++) 12 for(int k=0;k<=1;k++) 13 c[i][j]+=x[i][k]*y[k][j],c[i][j]%=mod; 14 for(int i=0;i<=1;i++) 15 for(int j=0;j<=1;j++) 16 x[i][j]=c[i][j]; 17 } 18 int main() 19 { 20 scanf("%lld",&p); 21 if(p==1||p==2){ printf("1\n"); return 0;} 22 a[0][0]=a[1][0]=a[0][1]=1; 23 b[0][0]=b[1][0]=b[0][1]=1; 24 p-=2; 25 while(p) 26 { 27 if(p&1) mi(a,b); 28 p>>=1; mi(b,b); 29 } 30 printf("%lld\n",a[0][0]); 31 return 0; 32 }