利用矩陣求斐波那契數列
阿新 • • 發佈:2018-12-15
利用矩陣的快速冪求斐波那契數列的程式碼實現
#include<stdio.h> #include<string.h> #define MOD 1000000007 struct juzhen { long long aa[2][2]; }; //矩陣的快速冪 juzhen chengfa(juzhen &a,juzhen &b) { juzhen c; memset(c.aa,0,sizeof(c.aa)); for(int i = 0;i < 2;i++) { for(int j = 0;j < 2;j++) { for(int k = 0;k < 2;k++) { c.aa[i][j] = (c.aa[i][j] + a.aa[i][k] * b.aa[k][j]) % MOD; } } } return c; } juzhen pow(juzhen a,long long n) { juzhen ans; for(int i = 0;i < 2;i++) { for(int j = 0;j < 2;j++) { if(i == j) { ans.aa[i][j] = 1; } else ans.aa[i][j] = 0; } } while(n) { if(n & 1) ans = chengfa(ans,a); a = chengfa(a,a); n /= 2; } return ans; } int main() { long long n; juzhen a,b; scanf("%I64d",&n); a.aa[0][0] = a.aa[0][1] = a.aa[1][0] = 1; a.aa[1][1] = 0; b = pow(a,n); printf("%I64d",b.aa[0][1] % MOD); return 0; }