poj 3070 矩陣快速冪
阿新 • • 發佈:2018-12-09
模板題
|pn+1 pn|
|pn pn-1|
[0][1]位置是pn的值,套個矩陣快速冪的板子,因為要取後四位,要mod 10000。
#include<iostream> #include<string> #include<cstdio> #include<cstring> #include<queue> #include<map> #include<cmath> #include<stack> #include<set> #include<vector> #include<algorithm> #define LL long long #define inf 1<<30 using namespace std; const int MAXN=2; const int mod=10000; struct Matrix { int mat[MAXN][MAXN]; Matrix() {} Matrix operator*(Matrix const &b)const { Matrix res; memset(res.mat, 0, sizeof(res.mat)); for (int i = 0 ;i < MAXN; i++) for (int j = 0; j < MAXN; j++) for (int k = 0; k < MAXN; k++) res.mat[i][j] = (res.mat[i][j]+this->mat[i][k] * b.mat[k][j])%mod; return res; } }; Matrix pow_mod(Matrix base, int n) { Matrix res; memset(res.mat, 0, sizeof(res.mat)); for (int i = 0; i < MAXN; i++) res.mat[i][i] = 1; while (n > 0) { if (n & 1) res = res*base; base = base*base; n >>= 1; } return res; } int main() { int n; Matrix base; base.mat[0][0]=1; base.mat[0][1]=1; base.mat[1][0]=1; base.mat[1][1]=0; while(~scanf("%d",&n)) { if(n==-1) break; Matrix ans=pow_mod(base,n); printf("%d\n",ans.mat[0][1]); } }