2014北京邀请赛E题_BNU_44673_Elegant String(DP+矩阵快速幂)
来源:互联网 发布:如何提高淘宝产品权重 编辑:程序博客网 时间:2024/06/09 21:38
题型:动态规划+矩阵快速幂
题意:N长度的串中的任意子串都不是0~K的全排列的构造方法数。
分析:
设dp[i][j]表示i长度最后连续j个字符无重复(j+1有重复)的字符串的个数。对于下一个状态,无非是两种情况,一种是j之内的任意一个,一种是j个字符以外的一个,这样可以推导出状态转移方程:
由于N范围是10^18,所以不能递推跑出,但是有了递推式,就可以采用矩阵快速幂
观察状态转移方程:
dp[i][1] = dp[i-1][1] + k * dp[i-1][2]
dp[i][2] = dp[i-1][1] + dp[i-1][2] + (k-1) * dp[i-1][3]
……
dp[i][k-1] = dp[i-1][1] + dp[i-1][2] + …… + dp[i-1][k-1] + 2 * dp[i-1][k]
dp[i][k] = dp[i-1][1] + dp[i-1][2] + …… + dp[i-1][k]
这样一看,就可以轻松推出变换矩阵了
====>
===>
ans = dp[N][1]
代码:
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#define mt(a,b) memset(a,b,sizeof(a))#define LL long longusing namespace std;const LL M = 50LL;const LL mod = 20140518LL;class Matrix { typedef long long typev;public: typev val[M][M]; void zero() { memset(val,0,sizeof(val)); } void unit() { zero(); for(LL i=0; i<M; i++) val[i][i]=1; }} ts,tmp;LL LEN;Matrix operator * (const Matrix &a,const Matrix &b) { Matrix tmp; tmp.zero(); for(LL k=0; k<LEN; k++) for(LL i=0; i<LEN; i++) { if(a.val[i][k]) for(LL j=0; j<LEN; j++) { tmp.val[i][j]+=a.val[i][k]*b.val[k][j]; tmp.val[i][j]%=mod; } } return tmp;}Matrix operator ^ (Matrix &a,LL p) { Matrix tmp; tmp.unit(); while(p) { if(p&1) tmp=tmp*a; a=a*a; p>>=1; } return tmp;}void init(LL k) { for(LL i=0; i<LEN; i++) { for(LL j=0; j<LEN; j++) { if(i>=j) { ts.val[i][j] = 1; } else if(i+1 == j) { ts.val[i][j] = k; k--; } else continue; } }}void OUTPUT() { for(LL i=0; i<LEN; i++) { for(LL j=0; j<LEN; j++) { printf("%d ",ts.val[i][j]); } puts(""); }}void OUTPUT1() { for(LL i=0; i<LEN; i++) { for(LL j=0; j<LEN; j++) { printf("%d ",tmp.val[i][j]); } puts(""); }}LL DP1[50],DPn[50];void LastSolve(LL k) { mt(DPn,0); for(LL i=0; i<k; i++) { LL sum = 0; for(LL j=0; j<k; j++) { sum += (tmp.val[i][j] * DP1[j])%mod; } DPn[i] = sum % mod; }}int main() { int cas,_; LL n,k; scanf("%d",&cas); for(_=1; _<=cas; _++) { scanf("%lld%lld",&n,&k); LEN = k; ts.zero(); init(k); //OUTPUT(); for(LL i=0; i<k; i++) { DP1[i] = k+1; } tmp.zero(); tmp = ts^(n-1); //OUTPUT1(); LastSolve(k); printf("Case #%d: ",_); printf("%lld\n",DPn[0]%mod); } return 0;}
0 0
- 2014北京邀请赛E题_BNU_44673_Elegant String(DP+矩阵快速幂)
- BNUOJ 34985 Elegant String 2014北京邀请赛E题 矩阵快速幂
- 2014北京邀请赛E题-矩阵快速幂
- 2014北京邀请赛E题-矩阵快速幂
- BNUOJ 34985 北京邀请赛 E题 Elegant String dp & 矩阵
- bnuoj34985 Elegant String 2014北京邀请赛E 递推+矩阵快速幂
- 2014北京邀请赛 E Elegant String bunoj 34985 矩阵快速幂
- 2014年北京邀请赛 E题 矩阵+dp
- 2014 BNU 邀请赛E题(递推+矩阵快速幂)
- 湘潭邀请赛 A题 矩阵快速幂
- 514E (矩阵快速幂+DP)
- HDU-6185-Covering(广西邀请赛D题)(矩阵快速幂)
- ASC(1)E(矩阵快速幂+简单DP)
- CF 691E Xor-sequences 矩阵快速幂 + dp
- 2017 ACM/ICPC 广西邀请赛||HDU 6185 Covering 【状压DP+矩阵快速幂】
- Codeforces Round #341 (Div. 2)E(矩阵快速幂优化dp,好题)
- Codeforces 821E Okabe and El Psy Kongroo【Dp+矩阵快速幂】套路题
- bnu 34990 Justice String ( 后缀数组 2014 北京邀请赛 J 题 )
- [Phonegap+Sencha Touch] 移动开发28 小米3不支持Sencha touch的解决办法
- 循环移动背景类
- 如何使用ActionBar
- 亮点!2014巴黎车展提前看
- JQuery Mobile 页面跳转后js不执行的问题(二)
- 2014北京邀请赛E题_BNU_44673_Elegant String(DP+矩阵快速幂)
- Linux内核初始化流程笔记
- js url传值C#后台接收中文乱码或浏览器不兼容,C#编码和解码
- Datastage 部署流程(9.1版本)
- 怎样使用 DFF: descriptive flexfield
- hadoop SequenceFileOutputFormat与LzopCodec压缩问题
- 打开百度地图报 Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)错误
- HDU 2492 Ping pong
- sqlalchemy整理(三)