标签:
题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1607
1 1 3 1 2 10 0 0 0
2 5
模板题没什么好说的。
(f[1],f[2])*[ 0,1 ]=(f[2],f[3])
[B, A ]
代码如下:
#include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> typedef long long ll; #define inf 0x3f3f3f3f #define mod 7 #include <math.h> #include <queue> using namespace std; struct ma { ll a[2][2]; } init,res; int A,B,n; ma mult(ma x,ma y) { ma tmp; for(int i=0; i<2; i++) { for(int j=0; j<2; j++) { tmp.a[i][j]=0; for(int k=0; k<2; k++) { tmp.a[i][j]=(tmp.a[i][j]+x.a[i][k]*y.a[k][j])%mod; } } } return tmp; } ma Pow(ma x,int K) { ma tmp; for(int i=0; i<2; i++) { for(int j=0; j<2; j++) { tmp.a[i][j]=(i==j); } } while(K) { if(K&1) tmp=mult(x,tmp); K>>=1; x=mult(x,x); } return tmp; } int main() { while(scanf("%d%d%d",&A,&B,&n)!=EOF) { if(A==0&&B==0&&n==0) break; if(n==1||n==2) { printf("1\n"); continue; } init.a[0][0]=0,init.a[0][1]=1; init.a[1][0]=B,init.a[1][1]=A; res=Pow(init,(n-1)); ll sum=(res.a[0][0]+res.a[0][1])%mod; printf("%lld\n",sum); } return 0; }
SDUT1607:Number Sequence(矩阵快速幂)
标签:
原文地址:http://www.cnblogs.com/zhangmingcheng/p/4328003.html