您的位置:首页 > 其它

HDU 5863 cjj's string game 快速幂 dp

2016-08-21 12:34 501 查看
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdio>
using namespace std;
#define mod 1000000007
#define maxn 22
#define ll long long
struct Matrix{
int mat[22][22];
void init(){
memset(mat,0,sizeof(mat));
}
Matrix (){}
};

Matrix operator * (Matrix&a,Matrix &b){
Matrix c;
c.init();
for(int i = 0;i < maxn; i++){
for(int j = 0;j < maxn; j++){
for(int k = 0;k < maxn; k++){
c.mat[i][j] = (c.mat[i][j] + (ll)a.mat[i][k]*b.mat[k][j])%mod ;
if(c.mat[i][j] >= mod)
c.mat[i][j] -= mod;
}
}
}
return c;
}

int main(){
int t,m,n,k;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&k);
Matrix a,b,c;
a.init();
for(int i = 0;i < m; i++){
a.mat[0][i] = k*k-k;
a.mat[i+1][i] = k;
}
a.mat[m+1][m] = k*k-k;
for(int i = m+1;i <= m*2; i++){
a.mat[m+1][i] = k*k-k;
if(i != m * 2 )
a.mat[i+1][i] = k;
else
a.mat[m][i] = k;
}
b.init();
for(int i = 0;i < maxn; i++)
b.mat[i][i] = 1;
while(n){
if(n&1)b = b * a;
n /= 2;
a = a * a;
}
ll ans = 0;
for(int i = m;i <= m * 2; i++){
ans += b.mat[i][0];
if(ans >= mod) ans-=mod;
}
printf("%d\n",ans%mod);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdu dp 矩阵加速