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

---------------------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
#define b(x) (1 << (x))
typedef unsigned int matrix[100][100];
const int maxn = 9;
 
bool OK[b(maxn)];
int N, n, U, M, D, p, k;
matrix Q, res, mat;
 
void Init() {
scanf("%d%d%d%d", &N, &n, &p, &k);
U = M = D = 0;
for(int i = 0; i < p; i++) {
int v; scanf("%d", &v);
if(v) U |= b(i);
}
for(int i = 0; i < p; i++) {
int v; scanf("%d", &v);
if(v) M |= b(i);
}
for(int i = 0; i < p; i++) {
int v; scanf("%d", &v);
if(v) D |= b(i);
}
M ^= b(k);
}
 
bool chk(int x) {
for(int i = 0; i < n; i++) if(x & b(i)) {
if(i <= k && ((M >> (k - i)) & x)) return 0;
if(i > k && ((M << (i - k)) & x)) return 0;
}
return true;
}
 
unsigned int Jud(int x, int y) {
for(int i = 0; i < n; i++) {
if(b(i) & x) {
if(i <= k && ((D >> (k - i)) & y)) return 0U;
if(i > k && ((D << (i - k)) & y)) return 0U;
}
if(b(i) & y) {
if(i <= k && ((U >> (k - i)) & x)) return 0U;
if(i > k && ((U << (i - k)) & x)) return 0U;
}
}
return 1U;
}
 
void Work() {
for(int s = b(n); s--; ) OK[s] = chk(s);
for(int i = b(n); i--; ) if(OK[i])
for(int j = b(n); j--; ) if(OK[j])
Q[j][i] = Jud(i, j);
for(int i = b(n); i--; ) res[i][i] = 1U;
for(N--; N; N >>= 1) {
if(N & 1) {
for(int i = b(n); i--; )
for(int j = b(n); j--; ) {
mat[i][j] = res[i][j];
res[i][j] = 0;
}
for(int k = b(n); k--; )
for(int i = b(n); i--; )
for(int j = b(n); j--; )
res[i][j] += Q[i][k] * mat[k][j];
}
for(int i = b(n); i--; )
for(int j = b(n); j--; ) {
mat[i][j] = Q[i][j];
Q[i][j] = 0;
}
for(int k = b(n); k--; )
for(int i = b(n); i--; )
for(int j = b(n); j--; )
Q[i][j] += mat[i][k] * mat[k][j];
}
unsigned int ans = 0;
for(int i = b(n); i--; ) if(OK[i])
for(int j = b(n); j--; ) if(OK[j])
ans += res[i][j];
printf("%u\n", ans);
}
 
int main() {
Init();
Work();
return 0;
}

---------------------------------------------------------------------------------------------

4000: [TJOI2015]棋盘

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 355  Solved: 159
[Submit][Status][Discuss]

Description

Input

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

Output

一个整数,表示可行方案Mod 2 ^32

Sample Input

2 2
3 1
0 1 0
1 1 1
0 1 0

Sample Output

7

HINT

1<=N<=10^6,1<=M<=6

Source

BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )的更多相关文章

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

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

  2. 【BZOJ4000】【LOJ2104】【TJOI2015】棋盘 (状压dp + 矩阵快速幂)

    Description ​ 有一个\(~n~\)行\(~m~\)列的棋盘,棋盘上可以放很多棋子,每个棋子的攻击范围有\(~3~\)行\(~p~\)列.用一个\(~3 \times p~\)的矩阵给出了 ...

  3. BZOJ 2004 公交线路(状压DP+矩阵快速幂)

    注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...

  4. 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂

    [题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...

  5. HDU 5434 Peace small elephant 状压dp+矩阵快速幂

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant  Accepts: 38  Submissions: ...

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

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

  7. 【XSY2524】唯一神 状压DP 矩阵快速幂 FFT

    题目大意 给你一个网格,每个格子有概率是\(1\)或是\(0\).告诉你每个点是\(0\)的概率,求\(1\)的连通块个数\(\bmod d=0\)的概率. 最开始所有格子的概率相等.有\(q\)次修 ...

  8. 2018.09.28 hdu5434 Peace small elephant(状压dp+矩阵快速幂)

    传送门 看到n的范围的时候吓了一跳,然后发现可以矩阵快速幂优化. 我们用类似于状压dp的方法构造(1(1(1<<m)∗(1m)*(1m)∗(1<<m)m)m)大小的矩阵. 然后 ...

  9. 瓷砖铺放 (状压DP+矩阵快速幂)

    由于方块最多涉及3行,于是考虑将每两行状压起来,dfs搜索每种状态之间的转移. 这样一共有2^12种状态,显然进行矩阵快速幂优化时会超时,便考虑减少状态. 进行两遍bfs,分别为初始状态可以到达的状态 ...

随机推荐

  1. iOS多线程GCD(转)

    原文:http://www.cnblogs.com/pure/archive/2013/03/31/2977420.html Grand Central Dispatch (GCD)是Apple开发的 ...

  2. Network()

    Network Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 60000/30000K (Java/Other) Total Submi ...

  3. Genealogical tree(拓扑结构+邻接表+优先队列)

    Genealogical tree Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) ...

  4. [置顶] 浅析objc的消息机制

    学习ios的同学都知道ojbc一种runtime的语言,runtime表明函数的真正执行的时候来确定函数执行的.这样的好处就是我们能很灵活的设计我们的代码,也能在看似合法的情况下做一些非常有意思的事情 ...

  5. bootstrap注意事项(一)

    1.移动设备优先 移动设备优先是 Bootstrap 3 的最显著的变化. 在之前的 Bootstrap 版本中(直到 2.x),您需要手动引用另一个 CSS,才能让整个项目友好的支持移动设备. 现在 ...

  6. create a (VSTO) Office 2007 add-in using VS 2012?

    You can get VS 2012 working with Office 2007. First create an Outlook 2010 Add-In and modify the pro ...

  7. 【转】使用Navicat for Oracle新建表空间、用户及权限赋予

    首先.我们来新建一个表空间.打开Navicat for Oracle,输入相关的的连接信息.如下图: 填入正确的信息,连接后.我们点击面板上的“其他”下的选项“表空间”,如下图: 进入表空间的界面,我 ...

  8. Oracle的用户管理,授权及备份

    一.用户进行授权的操作 创建用户:刚刚创建的用户并没有任何权限 CREATE USER 用户名 indentife BY 密码 授权:  GRANT 权限1,权限2... TO 用户权限有:CREAT ...

  9. Struts 2.x Unable to load configuration. - action

    问题分析:遇到该问题一般是struts中某个配置文件没有正确配置,比如: 1.class中的TestAction没有成功加载: <constant name="struts.i18n. ...

  10. StormAPI简单使用

    StormAPI .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB",& ...