快速幂求斐波那契数列
1 //答案对100000007取模
2 #include<iostream>
3 #include<cstring>
4 #include<cstdio>
5 #include<cmath>
6 #define MOD 100000007
7 using namespace std;
8 typedef long long ll;
9 struct sq{
10 ll sq[2][2];
11 void mes(){
12 memset(sq,0,sizeof(sq));
13 }
14 };
15 sq operator *(sq a,sq b){
16 sq tmp;
17 tmp.mes();
18 for(int i=0;i<2;i++){
19 for(int j=0;j<2;j++){
20 for(int k=0;k<2;k++){
21 tmp.sq[i][j]=(tmp.sq[i][j]+a.sq[i][k]*b.sq[k][j])%MOD;
22 }
23 }
24 }
25 return tmp;
26 }
27 ll fi(int n){
28 sq ans,m;
29 ans.mes();
30 m.mes();
31 m.sq[0][0]=m.sq[0][1]=m.sq[1][0]=1;
32 m.sq[1][1]=0;
33 ans.sq[0][0]=ans.sq[1][1]=1;
34 ans.sq[0][1]=ans.sq[1][0]=0;
35 while(n){
36 if(n&1){
37 ans=ans*m;
38 }
39 m=m*m;
40 n>>=1;
41 }
42 return ans.sq[0][1]%MOD;
43 }
44 int main(){
45 int n;
46 scanf("%d",&n);
47 printf("%lld",fi(n));
48 return 0;
49 }