矩阵快速幂取模
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <string> 7 #include <vector> 8 #include <set> 9 #include <map> 10 #include <stack> 11 #include <queue> 12 #include <sstream> 13 #include <iomanip> 14 using namespace std; 15 typedef long long LL; 16 const double INF=0x4fffffff; 17 const double EXP=1e-5; 18 const int MS=10; 19 const int SIZE=1000; 20 21 const int mod=10000007; 22 23 typedef vector<vector<int> > mat; 24 25 26 // calc A*B 27 28 mat mul(mat &A,mat &B) 29 { 30 mat C(A.size(),vector<int>(B[0].size())); 31 32 for(int i=0;i<A.size();i++) 33 { 34 for(int k=0;k<B.size();k++) 35 { 36 for(int j=0;j<B[0].size();j++) 37 { 38 C[i][j]=(C[i][j]+(LL)A[i][k]*B[k][j])%mod; // note 39 } 40 } 41 } 42 return C; 43 } 44 45 // calc A^n 46 47 48 mat pow(mat A,LL n) 49 { 50 mat B(A.size(),vector<int>(A[0].size())); 51 for(int i=0;i<A.size();i++) 52 B[i][i]=1; 53 while(n>0) 54 { 55 if(n&1) 56 B=mul(B,A); 57 A=mul(A,A); 58 n>>=1; 59 } 60 return B; 61 } 62 63 LL n; 64 void solve() 65 { 66 mat A(2,vector<int>(2)); 67 A[0][0]=A[0][1]=1; 68 A[1][0]=1;A[1][1]=0; 69 A=pow(A,n); 70 printf("%d\n",A[1][0]); 71 } 72 73 int main() 74 { 75 while(scanf("%lld",&n)==1) 76 { 77 solve(); 78 } 79 return 0; 80 }
上面的是斐波那契矩阵 求f[n].