HDU 5863 cjj's string game 快速幂 dp

来源:互联网 发布:打谱软件overture下载 编辑:程序博客网 时间:2024/05/06 01:50
#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<cstdio>using namespace std;#define mod 1000000007#define maxn 22#define ll long longstruct 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;}

0 0