hdu 2294 Pendant dp+矩阵
2013-08-22 20:36
288 查看
#include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <algorithm> #include <iostream> using namespace std; #define LL __int64 const LL mod=1234567891; LL n; struct matrix{ LL f[31][31]; }; matrix mul(matrix a,matrix b) { matrix c; LL i,j,k; memset(c.f,0,sizeof(c.f)); for(k=0;k<n;k++) { for(i=0;i<n;i++) { if(!a.f[i][k])continue; for(j=0;j<n;j++) { if(!b.f[k][j])continue; c.f[i][j]=(c.f[i][j]+a.f[i][k]*b.f[k][j])%mod; } } } return c; } matrix pow_mod(matrix a,LL b) { matrix s; memset(s.f,0,sizeof(s.f)); for(LL i=0;i<n;i++) s.f[i][i]=1; while(b) { if(b&1) s=mul(s,a); a=mul(a,a); b=b>>1; } return s; } int main() { LL T; cin>>T; while(T--) { LL i,j,m; cin>>m>>n; matrix e; n++; memset(e.f,0,sizeof(e.f)); for(i=0;i<n-1;i++) { e.f[i][i]=i+1; e.f[i][i+1]=n-i-2; } e.f[n-1][n-1]=e.f[n-2][n-1]=1; /*for(LL i=0;i<n;i++) { for(LL j=0;j<n;j++) cout<<e.f[i][j]<<" "; cout<<endl; }*/ e=pow_mod(e,m); cout<<(n-1)*e.f[0][n-1]%mod<<endl; } return 0; } /* 题意:求由k种珍珠组成的长度为1~n的项链的方案数和,注:每种方案必须用到k种珍珠 dp[i][j]表示长度为i且由j种珍珠组成的方案数; dp[i][j]=dp[i-1][j]*j+dp[i-1][j-1]*(k-j+1) ans =ans[n-1]+dp [k]; 矩阵: |dp[1][1] dp[1][2] ...dp[1][k] ans[0]|*|1 k-1 0 0|^n=|dp[n+1][1] dp[n+1][2] ...dp[n+1][] ans | |0 2 k-2 0| | ... | |0 0 k 1| |0 0 0 1| */
相关文章推荐
- hdu 2294 Pendant DP+矩阵优化
- HDU 2294 Pendant(DP+矩阵)
- HDU 2294 Pendant
- HDU - 2294 Pendant (DP滚动数组降维+矩阵高速功率)
- HDU 2294 Pendant
- hdu 2294 Pendant (dp+矩阵快速幂)
- HDU 2294 Pendant (DP+矩阵快速幂降维)
- HDU - 2294 Pendant (DP滚动数组降维+矩阵快速幂)
- HDU 2294【DP+快速幂】
- hdu 2294
- HDU 2294 Pendant DP+矩阵快速幂
- hdu 2294 Pendant(矩阵乘法)
- HDU 2294 Pendant
- hdu 2294 pendant
- hdu 2294 Pendant (动态规划+矩阵) 解题报告
- hdu 2294 Pendant
- hdu 1166 敌兵布阵 树状数组 模板题
- [恢]hdu 2083
- hdu 3117 Fibonacci Numbers
- hdu 1733 Escape