您的位置:首页 > 其它

矩阵快速幂比较好的写法

2017-08-29 14:48 141 查看
#include <cstdio>
#include <iostream>
#include <string.h>
#include <queue>
#include <algorithm>
typedef long long int lli;
using namespace std;

#define N 3
const lli mod = 1e9+7;//注意这里要是没有const会慢3~4倍。
struct mat{
lli mat

;
};
mat operator *(mat &a,mat &b){
mat c;
memset(c.mat,0,sizeof(c.mat));
for(int k = 0;k<N;++k){
for(int i = 0;i<N;++i){
for(int j=0;j<N;++j){
c.mat[i][j] += a.mat[i][k]*(b.mat[k][j] % mod) % mod;
}
}
}
return c;
}

mat qp(mat a,lli k){
mat c;
for(int i=0;i<N;i++)
for(int j =0;j<N;j++)
c.mat[i][j] = (i==j);
for(;k;k>>=1){
if(k&1) c=c*a;
a = a*a;
}
return c;
}

int main(){
int t;
cin>>t;
lli n;
while(t--){
scanf("%lld",&n);
if(n == 1){
printf("1\n");
continue;
}
mat a = {1,1,0,0,0,1,1,0,0};
mat b = {6,4,3,0,0,0,0,0,0};
a = qp(a,n-2);
b = b * a;
printf("%lld\n",b.mat[0][2] % mod);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: