HDU 2294【DP+快速幂】
来源:互联网 发布:企业在淘宝开店都亏本 编辑:程序博客网 时间:2024/06/18 05:24
睡眠是个好东西。。=w=。。
今天上午困困的。。明明已经发现怎么做了,结果建立矩阵的时候脑子一直是糊里糊涂的。。。。
睡了一觉,起来改改就过了。。。=w=~~
之前知道是DP+快速幂了,但是之前看的时候没有头绪。看第一眼也觉得是组合数,但是自己先草算几个例子就会发现是DP,用dp[i][j]表示目前的长度为i,用了j种颜色,那么可以由i-1的长度有j-1中颜色在剩下的k-j+1中颜色中挑一种转移,或者是i-1的长度下已经有j种颜色了,在这j种颜色中随便挑一种进行转移。公式:dp[i][j]=dp[i-1][j-1]*(k-j+1)+dp[i-1][j]。但是由于长度特别大,所以可以用矩阵快速幂。建立矩阵的时候要注意,由于答案是每个dp[i][k]的值之和,所以在k+1行处要将每个答案都进行保存记录。
#include <cstdio>#include <iostream>#include <cstring>using namespace std;#define maxn 33#define mod 1234567891#define ll long longint n;struct node{ ll mat[maxn][maxn]; void init() { memset(mat,0,sizeof(mat)); for(int i=1;i<maxn;i++) mat[i][i]=1; } void set() { memset(mat,0,sizeof(mat)); mat[1][1]=1; for(int i=2;i<=n;i++) { mat[i][i-1]=n-(i-1),mat[i][i]=i; } mat[n+1][n-1]=mat[n][n-1];mat[n+1][n]=n;mat[n+1][n+1]=1; } void debug() { for(int i=1;i<=n+1;i++) { for(int j=1;j<=n+1;j++) cout<<mat[i][j]<<" "; cout<<endl; } }};node matrix(node x,node y){ node z; memset(z.mat,0,sizeof(z.mat)); for(int i=1;i<=n+1;i++) { for(int j=1;j<=n+1;j++) { for(int k=1;k<=n+1;k++) { if(!y.mat[k][j]||!x.mat[i][k]) continue; z.mat[i][j]=(z.mat[i][j]+x.mat[i][k]*y.mat[k][j]%mod)%mod; } } } return z;}node quickpow(ll m){ node e,ans; e.set(); //e.debug(); ans.init(); while(m) { if(m&1) ans=matrix(ans,e); m>>=1; e=matrix(e,e); } return ans;}void solve(ll m){ node tmp=quickpow(m-1); //tmp.debug(); ll ans=tmp.mat[n+1][1]*n%mod; cout<<ans<<endl;}int main(){ int T; cin>>T; while(T--) { ll m; scanf("%lld%d",&m,&n); if(n==1) cout<<m<<endl; else solve(m); } return 0;}
0 0
- HDU 2294【DP+快速幂】
- HDU 2294 Pendant DP+矩阵快速幂
- hdu 2294 Pendant (dp+矩阵快速幂)
- HDU 2604 Queuing DP + 矩阵快速幂
- HDU 5318 (dp+矩阵快速幂优化)
- hdu 5564 快速矩阵幂+数位dp
- HDU 6030 DP + 矩阵快速幂
- HDU - 2294 Pendant (DP滚动数组降维+矩阵快速幂)
- HDU 2294 Pendant (DP+矩阵快速幂降维)
- hdu 2243 (AC自动机 + dp + 矩阵快速幂)
- hdu 2604 queuing dfa dp + 矩阵快速幂
- hdu 2243 ac自动机 dp +矩阵快速幂
- 【HDU 5001】Walk(矩阵快速幂+概率DP)
- hdu 5411 CRB and Puzzle (矩阵快速幂优化dp)
- HDU 5411 CRB and puzzle (Dp + 矩阵快速幂)
- HDU 2604 Queuing(dp+矩阵快速幂)
- hdu 5001 Walk(概率dp+搜索,矩阵快速幂)
- 利用矩阵快速幂加速二维dp hdu 5318
- IT界的小伙伴们看过来
- IntelliJ IDEA 14本地仓库配置
- DSP 数字信号处理资源
- java 回调(通俗易懂的解析)
- Effective Java 创建和销毁对象
- HDU 2294【DP+快速幂】
- 【整理】Android中的USB中的UsbAccessory和UsbDevice的区别
- LAMP基础知识
- map-combine过程解
- ImageView,Bitmap的浅析
- PCA
- Mac虚拟机安装win7教程之Mac双系统怎么删除一个WINDOWS
- plSQL 32位oracle客户端配置
- Android短信息验证码自动填写详细介绍