首先是状态压缩DP。。。

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

于是做完啦QAQQQ

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

 /**************************************************************
Problem: 4000
User: rausen
Language: C++
Result: Accepted
Time:208 ms
Memory:920 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <vector> using namespace std;
typedef unsigned int uint;
const int N = ; inline int read(); int n, m, p, K, Mx;
int a[N][N], f[N];
vector <int> mp[];
uint ans; struct mat {
uint x[][];
mat() {
memset(x, , sizeof(x));
}
inline void one() {
static int i;
*this = mat();
for (i = ; i < Mx; ++i) x[i][i] = ;
}
inline uint* operator [] (int t) {
return x[t];
} inline mat operator * (const mat &m) const {
static mat res;
static int i, j, k;
res = mat();
for (i = ; i < Mx; ++i)
for (j = ; j < Mx; ++j)
for (k = ; k < Mx; ++k)
res[i][j] += x[i][k] * m.x[k][j];
return res;
}
} A; inline mat pow(const mat& m, int y) {
static mat x, res;
x = m, res.one();
int i, j;
while (y) {
if (y & ) res = res * x;
x = x * x, y >>= ;
}
return res;
} inline bool in(int x) {
return <= x && x < m;
} inline bool check(int s1, int s2) {
static int i, j, t;
for (i = ; i < m; ++i) if ((s1 >> i) & ) {
for (j = ; j < mp[].size(); ++j)
if (in(t = i + mp[][j]) && ((s1 >> t) & )) return ;
for (j = ; j < mp[].size(); ++j)
if (in(t = i + mp[][j]) && ((s2 >> t) & )) return ;
}
for (i = ; i < m; ++i) if ((s2 >> i) & ) {
for (j = ; j < mp[].size(); ++j)
if (in(t = i + mp[][j]) && ((s2 >> t) & )) return ;
for (j = ; j < mp[].size(); ++j)
if (in(t = i + mp[][j]) && ((s1 >> t) & )) return ;
}
return ;
} int main() {
int i, j;
n = read(), m = read(), p = read(), K = read(), Mx = << m;
for (i = ; i < ; ++i)
for (j = ; j < p; ++j)
if (read() && !(i == && j == K)) mp[i].push_back(j - K);
for (i = ; i < Mx; ++i)
for (j = ; j < Mx; ++j) A[i][j] = check(i, j);
for (i = ; i < Mx; ++i) f[i] = bool(A[][i]);
A = pow(A, n);
for (i = ; i < Mx; ++i) ans += f[i] * A[i][];
printf("%u\n", ans);
return ;
} inline int read() {
static int x;
static char ch;
x = , ch = getchar();
while (ch < '' || '' < ch)
ch = getchar();
while ('' <= ch && ch <= '') {
x = x * + ch - '';
ch = getchar();
}
return x;
}

(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. How much do we need to learn to be a Self-driving Car Engineer?

    Before everything we need programming skills in C++ and Python. One of the suggested book for C++ le ...

  2. Sbt的使用初步和用sbt插件生成eclipse工程

    以前一直是用maven去管理java项目,现在开始写scala项目了但是在scala-ide中去编译scala项目和sbt的区别一直没弄清楚受到文章:http://my.oschina.net/yjw ...

  3. x名称空间中的标记拓展

    1.x:Type Type类可作为所有数据类型在编程层面上的抽象.在XAML中,如果想表达某个数据类型时就需要使用x:Type标记拓展.例子: 创建一个Button的派生类: using System ...

  4. JavaScript算法题之–随机数的生成

    JavaScript算法题之–随机数的生成 需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现. 先来生成一个有序的数组: 1 var arr = [], 2      ...

  5. 关于ListView嵌套GridView中的onItemClickListener失效问题

    一开始在ListView中设置了onItemClickListener,在里面Log输出Item列表的位置,完全没有反应, 网上大部分说的什么把子组件屏蔽掉(而且好多都是转载的一样的), 可是我希望的 ...

  6. RelativeLayout用到的一些重要的属性:

    下面是常用的一些属性 RelativeLayout用到的一些重要的属性: 第一类:属性值为true或falseandroid:layout_centerHrizontal 水平居中android:la ...

  7. javascript学习-原生javascript的小特效(多个运动效果整理)

    以下代码就不详细解析了,在我之前的多个运动效果中已经解析好多次了,重复的地方这里就不说明了,有兴趣的童鞋可以去看看之前的文章<原生javascript的小特效> <!DOCTYPE ...

  8. iOS 推送证书生成pem

    cert: openssl x509 -in aps_development\ \(8\).cer -inform der -out pushDeveCerTopem.pem key: openssl ...

  9. web设计经验<七>13步打造优雅的WEB字体

    今天,大多数浏览器已经默认支持Web字体,日趋增多的字体特性被嵌入最新版HTML和CSS标准中,Web字体即将迎来一个趋于复杂的崭新时代.下面是一些基本的关于字体的规则,特别适用于Web字体. 原文地 ...

  10. JavaWeb学习总结(十)--JDBC之MySQL大数据

    一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 但是,在mysql ...