洛谷 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 }
View Code

 

posted @ 2017-09-12 17:30  Alex丶Baker  阅读(192)  评论(0编辑  收藏  举报