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 5863 cjj's string game(矩阵快速幂) ★
- HDU 5863 cjj's string game(矩阵优化DP)
- HDU 5863 cjj's string game(矩阵快速幂)
- HDU 5863 cjj's string game(矩阵快速幂)
- Hdu-5863 cjj's string game(矩阵快速幂)
- HDU 5863 cjj's string game(矩阵dp)
- HDU - 5863 cjj's string game 矩阵快速幂
- 矩阵快速幂,动态规划(cjj's string game,HDU 5863)
- HDU 5863 cjj's string game(dp+矩阵快速幂)
- HDU - 5863 - cjj's string game (递推)
- HDU 5860 cjj's string game
- HDU 5863 cjj's string game
- hdu 4616 Game ( 经典树形dp )
- HDU 4616 Game (搜索)、(树形dp)
- 对抗搜索/dp-hdu-4753-Fishhead’s Little Game
- [HDU 3336]Count the String[kmp][DP]
- [HDU 3336]Count the String[kmp][DP]
- HDU 3336 Count the string KMP+DP
- HDU 4681 STRING dp+暴力。
- HDU-4681 String 枚举+DP