矩陣快速冪 斐波那契數列
阿新 • • 發佈:2018-09-08
href acm != blank 快速冪 efi ref tps ret
#include<bits/stdc++.h> #define ll long long using namespace std; struct matrix{ll g[2][2];}; matrix mul(matrix a,matrix b){ matrix c; c.g[0][0]=c.g[0][1]=c.g[1][0]=c.g[1][1]=0; for(int i=0;i<=1;i++) for(int j=0;j<=1;j++) for(int k=0;k<=1;k++) c.g[i][j]=(c.g[i][j]+a.g[i][k]*b.g[k][j])%p;return c; } matrix qpow(matrix a,ll n){ matrix b; b.g[0][0]=b.g[1][1]=1; b.g[0][1]=b.g[1][0]=0; while(n){ if(n&1) b=mul(b,a); a=mul(a,a);n>>=1;} return b; } int main(){ ll n; scanf("%lld",&n); matrix a; a.g[0][0]=a.g[0][1]=a.g[1][0]=1; a.g[1][1]=0; matrix ans=qpow(a,n); printf("%lld\n",ans.g[0][1]);return 0; }
https://blog.csdn.net/acm_cxq/article/details/51943875 矩陣快速冪求斐波那契數列
別人的
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define mod 10000 structMatrix { long long ma[2][2]; }; Matrix mul(Matrix A,Matrix B) { Matrix C; C.ma[0][0]=C.ma[0][1]=C.ma[1][0]=C.ma[1][1]=0; for(int i=0;i<2;i++) { for(int j=0;j<2;j++) { for(int k=0;k<2;k++) { C.ma[i][j]=(C.ma[i][j]+A.ma[i][k]*B.ma[k][j])%mod; } } } return C; } Matrix pow_mod(Matrix A,long long n) { Matrix B; B.ma[0][0]=B.ma[1][1]=1; B.ma[0][1]=B.ma[1][0]=0; while(n) { if(n&1) B=mul(B,A); A=mul(A,A); n>>=1; } return B; } int main() { long long n; while(~scanf("%lld",&n)&&n!=-1) { Matrix A; A.ma[0][0]=1;A.ma[0][1]=1; A.ma[1][0]=1;A.ma[1][1]=0; Matrix ans=pow_mod(A,n); printf("%lld\n",ans.ma[0][1]); } return 0; }
矩陣快速冪 斐波那契數列