矩阵快速幂
typedef vector<int> vec; typedef vector<vec> mat; typedef long long ll; const int M = 10000; mat mul(mat &A,mat &B){ mat C(A.size(),vec(B[0].size())); for(int i = 0; i < A.size(); i++){ for(int j = 0; j < B[0].size(); j++){ for(int k = 0; k < B.size(); k++){ C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % M; } } } return C; } mat pow(mat A,ll n){ mat B(A.size(),vec(A.size())); for(int i = 0; i < A.size(); i++){ B[i][i] = 1; } while(n){ if(n & 1){ B = mul(B,A); } A = mul(A,A); n >>= 1; } return B; } ll n; void solve() { mat A(2, vec(2)); A[0][0] = 1; A[0][1] = 1; A[1][0] = 1; A[1][1] = 0; A = pow(A, n); printf("%d\n",A[1][0]); }
自用
const LL MOD = 1e9+7; struct mat{ LL a[10][10]; }; mat mat_mul(mat x,mat y,int len){ mat res; memset(res.a,0,sizeof(res.a)); for(int i = 0 ; i < len ; i ++){ for(int j = 0 ; j < len ;j ++){ for(int k = 0 ; k < len ;k ++) res.a[i][j] = (res.a[i][j] + (x.a[i][k]*y.a[k][j]*1LL)%MOD)%MOD; } } return res; } mat mat_qpow(mat a,LL b,int len){ mat ans; memset(ans.a,0,sizeof(ans.a)); for(int i = 0 ;i < len ; i ++) ans.a[i][i] = 1LL; while(b){ if(b&1) ans = mat_mul(ans,a,len); a = mat_mul(a,a,len); b>>=1; } return ans; }