by luogu
我们将它用dp的思想来推一下
再进一步思考
可以发现
斐波那契!
再利用上矩阵递推
(我打印出来了1~12的ans、并找到了规律
1 #include<bits/stdc++.h> 2 3 4 #define M 1000000007 5 #define int long long 6 using namespace std; 7 8 9 long long jz[3][3],tmp[3][3],ans[3],base[3][3]; 10 long long n; 11 void zc() 12 { 13 tmp[0][0]=base[0][0]; 14 tmp[0][1]=base[0][1]; 15 tmp[1][0]=base[1][0]; 16 tmp[1][1]=base[1][1]; 17 base[0][0]=(tmp[0][0]*tmp[0][0]+tmp[0][1]*tmp[1][0])%M; 18 base[0][1]=(tmp[0][0]*tmp[0][1]+tmp[0][1]*tmp[1][1])%M; 19 base[1][0]=(tmp[1][0]*tmp[0][0]+tmp[1][1]*tmp[1][0])%M; 20 base[1][1]=(tmp[1][0]*tmp[0][1]+tmp[1][1]*tmp[1][1])%M; 21 22 return ; 23 } 24 void jc() 25 { 26 tmp[0][0]=jz[0][0]; 27 tmp[0][1]=jz[0][1]; 28 tmp[1][0]=jz[1][0]; 29 tmp[1][1]=jz[1][1]; 30 jz[0][0]=(tmp[0][0]*base[0][0]+tmp[0][1]*base[1][0])%M; 31 jz[0][1]=(tmp[0][0]*base[0][1]+tmp[0][1]*base[1][1])%M; 32 jz[1][0]=(tmp[1][0]*base[0][0]+tmp[1][1]*base[1][0])%M; 33 jz[1][1]=(tmp[1][0]*base[0][1]+tmp[1][1]*base[1][1])%M; 34 35 return ; 36 } 37 void ksm() 38 { 39 long long t=n; 40 while(t>0) 41 { 42 if (t&1) 43 { 44 jc(); 45 } 46 zc(); 47 t>>=1; 48 } 49 50 return ; 51 } 52 //1,3,4,7,11,18,29,47,76,123,199,322 53 //1,2,3,4,5 ,6 , 7 ,8 ,9 ,10 ,11 ,12 54 signed main() 55 { 56 ios::sync_with_stdio(false); 57 58 int T; 59 cin>>T; 60 jz[0][0]=1; 61 jz[1][1]=1;jz[1][0]=jz[0][1]=0; 62 base[0][0]=base[0][1]=base[1][0]=1;base[1][1]=0; 63 ans[0]=ans[1]=1; 64 while(T--) 65 { 66 jz[0][0]=1; 67 jz[1][1]=1;jz[1][0]=jz[0][1]=0; 68 base[0][0]=base[0][1]=base[1][0]=1;base[1][1]=0; 69 ans[0]=ans[1]=1; 70 71 cin>>n; 72 n--; 73 ksm(); 74 cout<<(jz[0][0]+jz[0][1]+jz[0][1])%M<<endl; 75 } 76 77 return 0; 78 }
帕秋莉!
原文:https://www.cnblogs.com/Hehe-0/p/14727877.html