首页 > 学院 > 开发设计 > 正文

矩阵快速幂--多校联盟

2019-11-06 06:21:08
字体:
来源:转载
供稿:网友

f(x+1)=f(x)+f(x−1)+sin(πx2)。

正常fibonacci就是

1 1 1 0

然后旋转矩阵: 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0

最后: [ 1 1 1 0 0 0 ] , [ 1 0 0 0 0 0 ] , [ 0 0 0 1 0 0 ] , [ 0 0 0 0 1 0 ] , [ 0 0 0 0 0 1 ] , [ 0 0 1 0 0 0 ] 他得n-2乘上[f2,f1,0,-1,0,1]T 因为sin是循环的~就好了

#include <cstdio>#include <iostream>#include <cstring>using namespace std;const long long MOD = 1000000007;struct Matrix{ long long m[6][6];};long long aa,bb,nn;Matrix Mul(Matrix a ,Matrix b){ Matrix tmp; memset(tmp.m,0,sizeof(tmp.m)); for(int i = 0 ; i < 6 ; i++) for(int j = 0 ; j < 6 ;j++) for(int k = 0 ; k < 6; k++) tmp.m[i][j] = (tmp.m[i][j]+a.m[i][k]*b.m[k][j])%MOD ; return tmp;}Matrix qpow(Matrix a,long long n){ Matrix tmp; memset(tmp.m,0,sizeof(tmp.m)); for(long long i = 0 ; i < 6 ;i++) tmp.m[i][i] = 1; while(n){ if(n & 1) tmp = Mul(tmp,a); n>>=1; a = Mul(a,a); } return tmp;}void sov(){ Matrix tmp; memset(tmp.m,0,sizeof(tmp.m)); tmp.m[0][0] = tmp.m[0][1] = tmp.m[0][2] = tmp.m[1][0] = tmp.m[2][3] = tmp.m[3][4] = tmp.m[4][5] = tmp.m[5][2] = 1; tmp = qpow(tmp,nn-2); long long ans = ((bb*tmp.m[0][0]+aa*tmp.m[0][1]-tmp.m[0][3]+tmp.m[0][5])%MOD+MOD)%MOD; cout<<ans<<"/n";}int main(){ while(cin>>aa>>bb>>nn){ if(nn == 1) cout<<aa<<"/n"; else if(nn == 2) cout<<bb<<"/n"; else sov(); }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表