状压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. Android应用中使用百度地图API定位自己的位置(二)

    官方文档:http://developer.baidu.com/map/sdkandev-6.htm#.E7.AE.80.E4.BB.8B3 百度地图SDK为开发人员们提供了例如以下类型的地图覆盖物: ...

  2. Mustache学习

    Mustache是基于JavaScript的一款模版Web引擎,Web 模板引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,通常是标准的 HTML 文档. 一.Musta ...

  3. CSS3 border属性的妙用

    .ribbon { background: #45c9c8; position: absolute; width: 75px; height: 25px; line-height: 25px; top ...

  4. oracle丢失temp表空间处理

    之前有做临时表空间的切换,切换后没drop tablespace就删除了temp01.dbf结果排序跟查dba_temp_files报错 SQL Mbytes from dba_temp_files; ...

  5. mysql存储过程和触发器的应用

    ***********[mysql 存储过程和触发器 -- 别安驹]********************* 1.什么情况下使用存储过程? 完成一些比较麻烦的逻辑,比如多表在mysql端的cpu很空 ...

  6. leetcode Binary Tree Paths python

    # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = ...

  7. C++中指针和引用的选择

    何时使用引用和指针      1. 尽可能使用引用传递参数      2. 尽可能的使用const来保护引用和指针      3. 在可以使用引用的时候不要使用指针      4. 不要试图给引用重新 ...

  8. ENVI5.1批量镶嵌工具界面按钮显示不全的解决方案

    打开批量镶嵌工具,在导出文件界面,部分按钮显示不全.具体见下图: 图 1 界面按钮显示不全 解决方案: 以win7.8系统为例: 显示桌面 – > 右键“个性化” – >显示 – > ...

  9. Linux网络管理——远程登录工具

    4. 远程登录工具 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB", ...

  10. iframe中调用父iframe中的方法

    function getRootWin(){       var win = window;       while (win != win.parent){            win = win ...