HDU2604Queuing矩阵乘法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
HDU2604Queuing矩阵乘法

HDU 2604 Queuing 矩阵乘法 By baiyun – 2011 年 8 月 9 日Posted in: ACM, 矩阵乘法 题目的意思比较简单, 就是给出一组由1, 0 组成的长为 L 的序列, 其中 不能出现”111″ 和 “101″ 子序列. 问这样的长L的序列有多少种. 解题: 假设 S 是已有的合法序列, 那么它的后缀只能是 : F1 = 000, F2 = 001, F3 = 010, F4 = 100, F5 = 011, F6 = 110 中的一种, 现在往S后接一个 字符, 有 2种选择 : 1 或者 0. 定义 DP[N][i] 表示长为N的序列的第i种 状态包含的合法序列的数目, 那么可以得到如下状态转移关系: DP[N][1] = DP[N-1][1] + DP[N-1][4]; DP[N][2] = DP[N-1][1] + DP[N-1][4]; DP[N][3] = DP[N-1][2]; DP[N][4] = DP[N-1][3] + DP[N-1][6]; DP[N][5] = DP[N-1][2]; DP[N][6] = DP[N-1][5]; 那么可以依此构造出矩阵 A , B = DP[3] : 这样, 就可以得到 DP[4] = A * B , DP[5] = A^2 * B ….. 最后用2分快速幂就能很快得到答案. #ifdef LOCAL #define SP system(pause); #define DBG Debug(); #else #define SP #define DBG #endif void Debug () { freopen ( 1.in, r, stdin ); freopen ( 1.out, w, stdout ); } #define MEM(x,y) memset(x,y,sizeof(x)) int N, M, K, fuck[5]; struct Mat { int n, m, mat[33][33]; Mat ( int nn = 0, int mm = 0 ) { n = nn, m = mm; MEM(mat,0); } Mat operator * ( const Mat t ) {//矩阵乘法 Mat res ( n ); for ( int i = 0; i n; ++ i ) { for ( int j = 0; j n; ++ j ) { for ( int k = 0; k n; ++ k ) { res.mat[j][i] += mat[j][k] * t.mat[k][i]; } res.mat[j][i] %= M; } } return res; } void print () {//输出矩阵 for ( int i = 0; i n; ++ i ) { for ( int j = 0; j n; ++ j ) { printf ( j ? %d : %d, mat[i][j]%M ); } puts ( ); } } }; Mat Pow ( Mat A, int k ) {// 求ak^k if ( k == 1 ) return A; Mat res = Pow ( A, k1 ); return k1 ? res * res * A : res * res; } void prs ( Mat A, Mat B, int n ) { Mat res = Pow ( A, n ); res = res * B; int sum = 0; for ( int i = 0; i 6; ++ i ) sum += res.mat[i][0]; printf ( %dn, sum % M ); } void init ( Mat A, Mat B ) {/*初始化*/ A.mat[0][0] = A.mat[0][3] = A.mat[1][0] = A.mat[1][3] = A.mat[2][1] = 1; A.mat[3][2] = A.mat[3][5] = A.mat[4][1] = A.mat[5][4] = 1; for ( int i = 0; i 6; ++ i ) B.mat[i][0] = 1; fuck[0] = 0, fuck[1] = 2, fuck[2] = 4, fuck[3] = 6; } int main () { //DBG Mat A ( 6 ), B ( 6 ); init ( A, B );/*

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档