状压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. 自己主动下载源代码_并编译_打包_部署_重新启动服务的Shell脚本

    这里面Shell的各个操作含义,可參考我三年前的这篇文章:http://blog.csdn.net/jadyer/article/details/7960802 #!/bin/sh APP_NAME= ...

  2. CSS技巧和犯错点总结

    4.14 CSS  background属性简写: background-position属性组合方式:[ left | center | right ] || [ top | bottom ] (组 ...

  3. NHibernate 3.3

    今天试了一下NHibernate 3.3比之前的版本简单,只需要引入两个dll,这两个dll分别是:Iesi.Collections.dll和NHibernate.dll 通过 http://nhfo ...

  4. JS 精粹(三)

    (一)基本问题 JS的数据类型(不是数据结构)分:简单数据类型(undefined\null\boolean\string\number\symbol).复杂数据类型(object). 对象是可变的键 ...

  5. 好博客分享 go需要运行容器? 不需要

    http://blog.csdn.net/wsl211511/article/details/51645324 粗浅看 Tomcat中设计模式分析 http://www.infoq.com/cn/ar ...

  6. Java并发编程实践(读书笔记) 任务执行(未完)

    任务的定义 大多数并发程序都是围绕任务进行管理的.任务就是抽象和离散的工作单元.   任务的执行策略 1.顺序的执行任务 这种策略的特点是一般只有按顺序处理到来的任务.一次只能处理一个任务,后来其它任 ...

  7. Java学习之System.arraycopy()方法

    java.lang.System的静态方法arraycopy()可以实现数组的复制,讲课的老师说这个方法效率比较高,如果数组有成千上万个元素,那么用这个方法,比用for语句循环快不少.System提供 ...

  8. phpcms-v9 前台模板文件中{pc}标签的执行流程

    前台pc标签的使用:{pc:content 参数名="参数值" 参数名="参数值" 参数名="参数值"} 如: {pc:content ac ...

  9. APP分享抓取网页图片

    var getShareImages = { defaultimg:"defaultimg.png", _allImgs:null, init:function(){ getSha ...

  10. struts2笔记04-XxxAware接口

    1.XxxAware接口 ApplicationAware, RequestAware,SessionAware, ParameterAware.      struts2提供了这四个Aware接口用 ...