首先是状态压缩DP。。。

然后我们发现转移都是一样的。。。可以矩阵优化。。。

于是做完啦QAQQQ

题目读不懂?恩多读几遍就读懂了,诶诶诶!别打我呀!

  1. /**************************************************************
  2. Problem: 4000
  3. User: rausen
  4. Language: C++
  5. Result: Accepted
  6. Time:208 ms
  7. Memory:920 kb
  8. ****************************************************************/
  9.  
  10. #include <cstdio>
  11. #include <cstring>
  12. #include <vector>
  13.  
  14. using namespace std;
  15. typedef unsigned int uint;
  16. const int N = ;
  17.  
  18. inline int read();
  19.  
  20. int n, m, p, K, Mx;
  21. int a[N][N], f[N];
  22. vector <int> mp[];
  23. uint ans;
  24.  
  25. struct mat {
  26. uint x[][];
  27. mat() {
  28. memset(x, , sizeof(x));
  29. }
  30. inline void one() {
  31. static int i;
  32. *this = mat();
  33. for (i = ; i < Mx; ++i) x[i][i] = ;
  34. }
  35. inline uint* operator [] (int t) {
  36. return x[t];
  37. }
  38.  
  39. inline mat operator * (const mat &m) const {
  40. static mat res;
  41. static int i, j, k;
  42. res = mat();
  43. for (i = ; i < Mx; ++i)
  44. for (j = ; j < Mx; ++j)
  45. for (k = ; k < Mx; ++k)
  46. res[i][j] += x[i][k] * m.x[k][j];
  47. return res;
  48. }
  49. } A;
  50.  
  51. inline mat pow(const mat& m, int y) {
  52. static mat x, res;
  53. x = m, res.one();
  54. int i, j;
  55. while (y) {
  56. if (y & ) res = res * x;
  57. x = x * x, y >>= ;
  58. }
  59. return res;
  60. }
  61.  
  62. inline bool in(int x) {
  63. return <= x && x < m;
  64. }
  65.  
  66. inline bool check(int s1, int s2) {
  67. static int i, j, t;
  68. for (i = ; i < m; ++i) if ((s1 >> i) & ) {
  69. for (j = ; j < mp[].size(); ++j)
  70. if (in(t = i + mp[][j]) && ((s1 >> t) & )) return ;
  71. for (j = ; j < mp[].size(); ++j)
  72. if (in(t = i + mp[][j]) && ((s2 >> t) & )) return ;
  73. }
  74. for (i = ; i < m; ++i) if ((s2 >> i) & ) {
  75. for (j = ; j < mp[].size(); ++j)
  76. if (in(t = i + mp[][j]) && ((s2 >> t) & )) return ;
  77. for (j = ; j < mp[].size(); ++j)
  78. if (in(t = i + mp[][j]) && ((s1 >> t) & )) return ;
  79. }
  80. return ;
  81. }
  82.  
  83. int main() {
  84. int i, j;
  85. n = read(), m = read(), p = read(), K = read(), Mx = << m;
  86. for (i = ; i < ; ++i)
  87. for (j = ; j < p; ++j)
  88. if (read() && !(i == && j == K)) mp[i].push_back(j - K);
  89. for (i = ; i < Mx; ++i)
  90. for (j = ; j < Mx; ++j) A[i][j] = check(i, j);
  91. for (i = ; i < Mx; ++i) f[i] = bool(A[][i]);
  92. A = pow(A, n);
  93. for (i = ; i < Mx; ++i) ans += f[i] * A[i][];
  94. printf("%u\n", ans);
  95. return ;
  96. }
  97.  
  98. inline int read() {
  99. static int x;
  100. static char ch;
  101. x = , ch = getchar();
  102. while (ch < '' || '' < ch)
  103. ch = getchar();
  104. while ('' <= ch && ch <= '') {
  105. x = x * + ch - '';
  106. ch = getchar();
  107. }
  108. return x;
  109. }

(p.s. 这道题是0开始标号的。。。注意了QAQQQ)

BZOJ4000 [TJOI2015]棋盘的更多相关文章

  1. BZOJ4000 TJOI2015棋盘(状压dp+矩阵快速幂)

    显然每一行棋子的某种放法是否合法只与上一行有关,状压起来即可.然后n稍微有点大,矩阵快速幂即可. #include<iostream> #include<cstdio> #in ...

  2. [BZOJ4000][TJOI2015]棋盘(状压DP+矩阵快速幂)

    题意极其有毒,注意给的行列都是从0开始的. 状压DP,f[i][S]表示第i行状态为S的方案数,枚举上一行的状态转移.$O(n2^{2m})$ 使用矩阵加速,先构造矩阵a[S1][S2]表示上一行为S ...

  3. BZOJ4000 [TJOI2015]棋盘 【状压dp + 矩阵优化】

    题目链接 BZOJ4000 题解 注意题目中的编号均从\(0\)开始= = \(m\)特别小,考虑状压 设\(f[i][s]\)为第\(i\)行为\(s\)的方案数 每个棋子能攻击的只有本行,上一行, ...

  4. 【BZOJ4000】[TJOI2015]棋盘(矩阵快速幂,动态规划)

    [BZOJ4000][TJOI2015]棋盘(矩阵快速幂,动态规划) 题面 BZOJ 洛谷 题解 发现所有的东西都是从\(0\)开始编号的,所以状压只需要压一行就行了. 然后就可以随意矩乘了. #in ...

  5. BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )

    状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...

  6. [TJOI2015] 棋盘

    Description 为了提高智商,ZJY去新世界旅游了.可是旅游过后的ZJY杯具的发现要打开通往原来世界的门,必须要解开门上面画的谜题.谜题是这样的:有个\(n\)行\(m\)列的棋盘,棋盘上可以 ...

  7. 【刷题】BZOJ 4000 [TJOI2015]棋盘

    Description Input 输入数据的第一行为两个整数N,M表示棋盘大小.第二行为两个整数P,K, 表示攻击范围模板的大小,以及棋子在模板中的位置.接下来三行, 每行P个数,表示攻击范围的模版 ...

  8. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  9. TJOI2015 day2解题报告

    TJOI2015终于写完啦~~~ T1:[TJOI2015]旅游 描述:(BZ没题面只能口述了..)一个人在一棵树上走,每次从a->b会进行一次贸易(也就是在这条路径上买入物品然后在后面卖出)然 ...

随机推荐

  1. 【CC评网】2013.第38周 要阅读 要有好工具

    要阅读,要有好工具 Reeder终于在ipad上推出了第二代版本,终于脱离了Google reader而独立存在: 自从Google reader关闭之后,我就在各种支持rss的阅读器中游荡,却总是找 ...

  2. python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)

    python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...

  3. hdu 5950 Recursive sequence 矩阵快速幂

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  4. c 函数调用产生的汇编指令和数据在内存情况(2)

    c 函数调用产生的汇编指令和数据在内存情况(1) 一直对函数调用的具体汇编指令和各种变量在内存的具体分配,一知半解.各种资料都很详细,但是不实践,不亲自查看下内存总不能笃定.那就自己做下. 两个目的: ...

  5. spring DI原理

    什么是IOC? 也称依赖注入 当一个类,需要另一个类的时候,我们不需要再另一个类里进行创建 对象,spring容器会给我们自动的创建 IOC的实现? 通过一定的技术读取spring.xml文件信息,比 ...

  6. 初识redis——mac下搭建redis环境

    一.redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有 ...

  7. MVC中Url请求与控制器的默认约定

    1.请求的url如:http://localhost:52481/Home/Browse?genre=1控制器方法:public string Browse(string genre) //这里返回值 ...

  8. Monkey学习(1)环境搭建

    环境搭建: Monkey程序由Android系统自带,需要配置J2SE平台的JDK,还需要配置Android平台的SDK. 1)下载和配置JDK 下载与安装JDK过程省略... 配置JDK环境变量,我 ...

  9. 路由器WAN端与LAN端的区别

    路由器WAN端与LAN端的区别 WAN的全称为Wide Area Network,即广域网.而LAN的全称为Local Area Network,即局域网.WAN口主要用于连接外部网络,如ADSL.D ...

  10. Maven——eclipse中使用Maven创建Web项目

    原文:http://www.cnblogs.com/xdp-gacl/p/4054814.html 一.创建Web项目 1.1 选择建立Maven Project 选择File -> New - ...