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

Solution

这题有点无聊

先考虑把按照棋盘每一行去状压dp,然后发现跑不了

于是又了解到每次状压的转移方程是一样的,并且 \(m\) 小得可怜,于是就可以用矩阵乘法优化

预处理的话就直接暴力枚举每一个状态和下一个状态,看能否转移就好了

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=1000000+10,MAXM=(1<<6)+10;
int n,m,P,K,G[4],atk1,atk2;
ui ans;
struct Matrix{
ui a[MAXM][MAXM];
inline Matrix operator * (const Matrix &A) const {
Matrix B;
for(register int i=0;i<(1<<m);++i)
for(register int j=0;j<(1<<m);++j)
{
B.a[i][j]=0;
for(register int k=0;k<(1<<m);++k)B.a[i][j]+=a[i][k]*A.a[k][j];
}
return B;
};
};
Matrix A;
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline int check(int st,int ed)
{
atk1=0,atk2=0;
for(register int i=0;i<m;++i)
if(st&(1<<i))
{
if(P-K-1>=i)atk1|=(G[1]>>P-K-1-i),atk2|=(G[2]>>P-K-1-i);
else atk1|=(G[1]<<i-P+K+1),atk2|=(G[2]<<i-P+K+1);
}
if((atk1&st)||(atk2&ed))return 0;
atk1=0;atk2=0;
for(register int i=0;i<m;++i)
if(ed&(1<<i))
{
if(P-K-1>=i)atk1|=(G[1]>>P-K-1-i),atk2|=(G[0]>>P-K-1-i);
else atk1|=(G[1]<<i-P+K+1),atk2|=(G[0]<<i-P+K+1);
}
if((atk1&ed)||(atk2&st))return 0;
return 1;
}
inline Matrix qexp(Matrix a,int b)
{
Matrix res=a;b--;
while(b)
{
if(b&1)res=res*a;
a=a*a;
b>>=1;
}
return res;
}
int main()
{
read(n);read(m);read(P);read(K);
for(register int i=0;i<3;++i)
for(register int j=0,x;j<P;++j)read(x),G[i]|=(x<<P-j-1);
G[1]^=(1<<P-K-1);
for(register int i=0;i<(1<<m);++i)
for(register int j=0;j<(1<<m);++j)A.a[i][j]=check(i,j);
A=qexp(A,n);
for(register int i=0;i<(1<<m);++i)ans+=A.a[0][i];
printf("%u\n",ans);
return 0;
}

【刷题】BZOJ 4000 [TJOI2015]棋盘的更多相关文章

  1. BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )

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

  2. BZOJ第一页刷题计划

    BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2 ...

  3. 【刷题】BZOJ 2407 探险

    Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...

  4. 【刷题】BZOJ 4543 [POI2014]Hotel加强版

    Description 同OJ3522 数据范围:n<=100000 Solution dp的设计见[刷题]BZOJ 3522 [Poi2014]Hotel 然后发现dp的第二维与深度有关,于是 ...

  5. 【刷题】BZOJ 4316 小C的独立集

    Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使 ...

  6. 【刷题】BZOJ 4176 Lucas的数论

    Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i< ...

  7. 【刷题】BZOJ 2260 商店购物

    Description Grant是一个个体户老板,他经营的小店因为其丰富的优惠方案深受附近居民的青睐,生意红火.小店的优惠方案十分简单有趣.Grant规定:在一次消费过程中,如果您在本店购买了精制油 ...

  8. 【刷题】BZOJ 4566 [Haoi2016]找相同字符

    Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别为 ...

  9. 【刷题】BZOJ 3365 [Usaco2004 Feb]Distance Statistics 路程统计

    Description 在得知了自己农场的完整地图后(地图形式如前三题所述),约翰又有了新的问题.他提供 一个整数K(1≤K≤109),希望你输出有多少对农场之间的距离是不超过K的. Input 第1 ...

随机推荐

  1. ETH—Lwip以太网通信

    第39章     ETH—Lwip以太网通信 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...

  2. Hadoop大数据平台构建

    基础:linux常用命令.Java编程基础大数据:科学数据.金融数据.物联网数据.交通数据.社交网络数据.零售数据等等. Hadoop: 一个开源的分布式存储.分布式计算平台.(基于Apache) H ...

  3. Android“寄生兽”漏洞技术分析

    一.关于app的缓存代码 安卓的应用程序apk文件是zip压缩格式的文件,apk文件中包含的classes.dex文件相当于app的可执行文件,当app运行后系统会对classes.dex进行优化,生 ...

  4. # 20155218 徐志瀚 EXP7 网络欺诈

    20155218 徐志瀚 EXP7 网络欺诈 1. URL攻击 1.在终端中输入命令netstat -tupln |grep 80,查看80端口是否被占用 发现没有被占用: 2.输入指令service ...

  5. mysql提示Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist解决方法

    一次重启mysql发现无法启动成功,通过检查mysql日志发现问题并解决了问题. mysql启动失败的日志: [root@nn ~]# tail -n 20 /var/log/mysqld.log 1 ...

  6. EJB开发第二期---开发具有本地接口的无状态Bean

    一.EJB中的bean 1.1 EJB中bean分类 会话bean(session bean) 负责与客户端交互,是编写业务逻辑的地方,在会话bean中可以通过jdbc直接操作数据库,但大多数情况下都 ...

  7. Python学习之路(一)之Python基础1

    目录 Python基础初识 1.Python介绍 1.1.Python简介 1.2.Python特点 1.3.Python应用领域 1.4.Python解释器的种类 2.Python基础初识 2.1. ...

  8. 问题解决:IDEA右键选择new新文件的时候没有JSP文件选项解决

    参考: https://blog.csdn.net/tomorrow_fine/article/details/74090308 用上面的方法就可以解决了, 但是如果把web目录设置成了额外的,那id ...

  9. CS50.5

    函数,全局变量,参数,返回值. 1,类型转换. 各种数据类型进行转换 2,API函数 应用程序编程接口. application programming interface 写写随笔吧,先说计算机.. ...

  10. 一个可以代替冗长switch-case的消息分发小框架

    在项目中,我需要维护一个应用层的字节流协议.这个协议的每条报文都是一个字节数组,数组的头两个字节表示消息的传送方向,第三.四个字节表示消息ID,也就是消息种类,再往后是消息内容.时间戳.校验码等……整 ...