建立矩阵,跑快速幂

  1. /**************************************************************
  2. Problem: 4000
  3. User: idy002
  4. Language: C++
  5. Result: Accepted
  6. Time:32 ms
  7. Memory:836 kb
  8. ****************************************************************/
  9.  
  10. #include <cstdio>
  11. #include <cstring>
  12. #define M 6
  13.  
  14. struct Matrix {
  15. unsigned v[<<M][<<M];
  16. const unsigned *operator[]( int i ) const { return v[i]; }
  17. };
  18.  
  19. int n, m, p, k, bound;
  20. int attack[];
  21. int stat[<<M], id[<<M], stot;
  22. Matrix base, dest;
  23.  
  24. void make_unit( Matrix &x ) {
  25. for( int i=; i<stot; i++ )
  26. for( int j=; j<stot; j++ )
  27. x.v[i][j] = i==j;
  28. }
  29. Matrix operator*( const Matrix &a, const Matrix &b ) {
  30. Matrix c;
  31. for( int i=; i<stot; i++ )
  32. for( int j=; j<stot; j++ ) {
  33. c.v[i][j] = ;
  34. for( int k=; k<stot; k++ )
  35. c.v[i][j] += a[i][k]*b[k][j];
  36. }
  37. return c;
  38. }
  39. Matrix mpow( Matrix a, int b ) {
  40. Matrix rt;
  41. for( make_unit(rt); b; b>>=,a=a*a )
  42. if( b& ) rt=rt*a;
  43. return rt;
  44. }
  45. int getarea( int s, int a ) {
  46. int rt = ;
  47. for( int b=; b<m; b++ ) {
  48. if( (s>>b)& ) {
  49. int aa = a;
  50. if( b<k )
  51. aa >>= k-b;
  52. else
  53. aa <<= b-k;
  54. aa &= bound;
  55. rt |= aa;
  56. }
  57. }
  58. return rt;
  59. }
  60. void build() {
  61. stot = ;
  62. memset( id, -, sizeof(id) );
  63. for( int s=; s<=bound; s++ ) {
  64. if( getarea(s,attack[])&s ) continue;
  65. stat[stot]=s;
  66. id[s] = stot;
  67. stot++;
  68. }
  69. for( int s1=; s1<=bound; s1++ ) {
  70. if( id[s1]==- ) continue;
  71. for( int s2=; s2<=bound; s2++ ) {
  72. if( id[s2]==- ) continue;
  73. if( getarea(s1,attack[])&s2 ) continue;
  74. if( getarea(s2,attack[])&s1 ) continue;
  75. base.v[id[s1]][id[s2]] = ;
  76. }
  77. }
  78. }
  79. int main() {
  80. scanf( "%d%d%d%d", &n, &m, &p, &k );
  81. bound = (<<m)-;
  82. for( int i=; i<; i++ )
  83. for( int j=,o; j<p; j++ ) {
  84. scanf( "%d", &o );
  85. attack[i] = attack[i] | (o<<j);
  86. }
  87. attack[] ^= <<k;
  88. build();
  89. dest = mpow( base, n- );
  90. unsigned ans = ;
  91. for( int i=; i<stot; i++ )
  92. for( int j=; j<stot; j++ )
  93. ans += dest[i][j];
  94. printf( "%u\n", ans );
  95. }

bzoj 4000 矩阵快速幂优化DP的更多相关文章

  1. 2018.10.23 bzoj1297: [SCOI2009]迷路(矩阵快速幂优化dp)

    传送门 矩阵快速幂优化dp简单题. 考虑状态转移方程: f[time][u]=∑f[time−1][v]f[time][u]=\sum f[time-1][v]f[time][u]=∑f[time−1 ...

  2. 省选模拟赛 Problem 3. count (矩阵快速幂优化DP)

    Discription DarrellDarrellDarrell 在思考一道计算题. 给你一个尺寸为 1×N1 × N1×N 的长条,你可以在上面切很多刀,要求竖直地切并且且完后每块的长度都是整数. ...

  3. 2018.10.22 bzoj1009: [HNOI2008]GT考试(kmp+矩阵快速幂优化dp)

    传送门 f[i][j]f[i][j]f[i][j]表示从状态"匹配了前i位"转移到"匹配了前j位"的方案数. 这个东西单次是可以通过跳kmp的fail数组得到的 ...

  4. 2018.10.16 uoj#340. 【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂优化dp)

    传送门 一道不错的矩阵快速幂优化dpdpdp. 设f[i][j][k][l]f[i][j][k][l]f[i][j][k][l]表示前iii轮第iii轮还有jjj个一滴血的,kkk个两滴血的,lll个 ...

  5. 【bzoj1009】[HNOI2008]GT考试(矩阵快速幂优化dp+kmp)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 这道题一看数据范围:$ n<=10^9 $,显然不是数学题就是矩乘快速幂优 ...

  6. BZOJ 1009 [HNOI2008]GT考试(矩阵快速幂优化DP+KMP)

    题意: 求长度为n的不含长为m的指定子串的字符串的个数 1s, n<=1e9, m<=50 思路: 长见识了.. 设那个指定子串为s f[i][j]表示长度为i的字符串(其中后j个字符与s ...

  7. LOJ2325. 「清华集训 2017」小 Y 和恐怖的奴隶主【矩阵快速幂优化DP】【倍增优化】

    LINK 思路 首先是考虑怎么设计dp的状态 发现奴隶主的顺序没有影响,只有生命和个数有影响,所以就可以把每个生命值的奴隶主有多少压缩成状态就可以了 然后发现无论是什么时候一个状态到另一个状态的转移都 ...

  8. bzoj1009 [HNOI2008]GT考试——KMP+矩阵快速幂优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串计数DP问题啊...连题解都看了好多好久才明白,别提自己想出来的蒟蒻我... 首 ...

  9. 2019.02.11 bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)

    传送门 题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9, ...

随机推荐

  1. html中的body和head有什么区别??

    我的html文件如下: <html> <title>这是我的测试</title> <head> my test </head> <bo ...

  2. Linux 生产实习01

    Linux 生产实习01 标签(空格分隔): Linux 2018.07.02 相关软件下载地址:Linux Study 0x01. 安装 VMware Workstation VMware Work ...

  3. H5页面调用手机打电话功能

    <head>里面加上: <meta name="format-detection" content="telephone=yes"/> ...

  4. css实现导航切换

    css实现导航切换 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <title>css实现导航切换&l ...

  5. ***Bootstrap FileInput插件的使用经验汇总

    插件下载地址: https://github.com/kartik-v/bootstrap-fileinput/ 官方DEMO查看: http://plugins.krajee.com/file-ba ...

  6. android:怎么实现一个控件与另一个指定控件左对齐

    https://segmentfault.com/q/1010000003905460?_ea=425861 针对你这种情况,最简单的一种办法是,设置两个TextView的宽度为固定值,且相等. Li ...

  7. Android Studio一直 Fetching Documentation...

    Android查看私有库android-spport-v4.jar & android-support-v7-appcompat.jar源码 https://www.cnblogs.com/s ...

  8. Git(五)IDEA应用Git

    一.IDEA客户端git 1.提交代码到本地仓库 1. 关联Git,创建本地库 关联git 配置git环境变量 设置本地仓库目录,一般是IDEA工作空间,选择VCS->Import into V ...

  9. 利用openssl构建根证书-服务器证书-客户证书

    利用openssl构建根证书-服务器证书-客户证书 OpenSSL功能远胜于KeyTool,可用于根证书,服务器证书和客户证书的管理 一.构建根证书 1.构建根证书前,需要构建随机数文件(.rand) ...

  10. 【LOJ】#2181. 「SDOI2015」排序

    题解 还以为是啥毒瘤题 然后是个搜索题 复杂度算起来挺大 然后跑起来就连0.1ms不到= = 就是从大到小进行每种操作,搜出来一种操作就乘上一个操作数的阶乘就行 如果现在进行的操作操作\(2^i\)那 ...