状压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. LCD与ARM,具体

    一  实验内容简要描写叙述 1.实验目的 学会驱动程序的编写方法,配置S3C2410的LCD驱动,以及在LCD屏上显示包含bmp和jpeg两种格式的图片 2.实验内容  (1)分析S3c2410实验箱 ...

  2. JAVA-反射-getGenericSuperclass()

    1 public class Person<T> { 2 3 } 4 5 import java.lang.reflect.ParameterizedType; 6 import java ...

  3. 关于FND_PROFILE与FND_GLOBLE[Z]

    fnd_global package可以取得一些關於當前login in用戶的信息 fnd_concurrent_requests functions   select FND_PROFILE.VAL ...

  4. java -Xms -Xmx -XX:PermSize -XX:MaxPermSize

    java  -Xms -Xmx -XX:PermSize -XX:MaxPermSize     在做java开发时尤其是大型软件开发时经常会遇到内存溢出的问题,比如说OutOfMemoryError ...

  5. echarts如何做出堆积图总计的效果

    首先说下,我这这数据是假数据,实际是公司做图的一部分数据自己修改了下下,不涉及泄密什么的. 第一.echarts本身是没有这个在柱子上面加total的这点大家默认下就好了,因为我不是什么前端专职程序员 ...

  6. js监听input等表单输入框的变化事件oninput

    js监听input等表单输入框的变化事件oninput,手机页面开发中使用到文本框textarea输入字符监听文本框变化计算还可以输入多少字符,如果使用onkeyup的话是无法监听到输入法输入的文本变 ...

  7. java.util.Random 类的 nextInt(int num )

    随机产生3个67~295的整数并找出数值居中的数 并输出中间的数例如:100,225和200,输出200 要随机产生某个范围内的整数,用 java.util.Random 类的 nextInt(int ...

  8. 【Howie玩docker】-Docker常用命令操作

    attach     附加到一个运行的容器上面       --no-stdin=false Do not attach stdin       --sig-proxy=true Proxify al ...

  9. ORACLE同义词总结

    ORACLE同义词总结 同义词概念 Oracle的同义词(synonyms) 从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系.它可以节省大量的数据库空间,对不同用户的操作同一张表没有多 ...

  10. WINDOWS硬件通知应用程序的常方法(五种方式:异步过程调用APC,事件方式VxD,消息方式,异步I/O方式,事件方式WDM)

    摘要:在目前流行的Windows操作系统中,设备驱动程序是操纵硬件的最底层软件接口.为了共享在设备驱动程序设计过程中的经验,给出设备驱动程序通知应用程序的5种方法,详细说明每种方法的原理和实现过程,并 ...