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

状压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

 

转载于:https://www.cnblogs.com/JSZX11556/p/5156798.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux传文件file,linux文件的传输与压缩快速入门

scp --- 用于远程拷贝文件上传文件scp file userip:/file下载文件scp userip:/file filersync --- 远程同步&#xff0c;速度块&#xff0c;默认会忽略&#xff0c;文件属性&#xff0c;链接文件&#xff0c;设备文件-r --- 同步目录-p --- 同步权限-o --- 同步文件所有人-g --…

delphi 中如果不进行 closehandle 会怎么样_心理学:当你迷茫了,请坚持做三件事,你的未来会越来越好...

我们总是这样激励自己&#xff1a;未来是美好的。但是&#xff0c;生活不可能处处如意&#xff0c;人的一生也难以风平浪静&#xff0c;有巅峰就有低谷&#xff0c;有明朗就有迷茫。或是找不到未来发展的方向&#xff0c;或是事业、生活遭受了重大挫折&#xff0c;我们每个人都…

随笔2 PAT1001.A+B Format (20)

1001.AB Format(20) 题目链接 1001.AB Format (20) C 代码 第一次使用markdown&#xff0c;还不是很习惯&#xff0c;现在努力的在适应它 首先这道题我们很容易就可以读懂题意&#xff0c;就是简单的ab&#xff0c;只不过要求我们在输出sum的时候处理一下数字的格式。那么我的做…

mybatis传递多个参数_深入浅出MyBatis:MyBatis解析和运行原理

原文&#xff1a;https://juejin.im/post/5abcbd946fb9a028d1412efc本篇文章是「深入浅出MyBatis&#xff1a;技术原理与实践」书籍的总结笔记。上一篇介绍了反射和动态代理基础&#xff0c;主要是为本篇文章做个铺垫&#xff0c;反射使配置和灵活性大大提高&#xff0c;可以给…

linux ps 进程组,linux进程管理(2)---进程的组织结构

一、目的linux为了不同的进程管理目的&#xff0c;使用了不同的方法组织进程之间的关系&#xff0c;为了体现父子关系&#xff0c;使用了“树形”图&#xff1b;为了对同一信号量统一处理&#xff0c;使用了进程组&#xff1b;为了快速查找某个进程&#xff0c;使用了哈希表&am…

统计建模与r软件_【统计建模与R软件笔记】008 描述统计量(1)

今天我们开始来学习描述统计量吧&#xff01;位置的度量位置的度量就是用来描述定量资料的集中趋势的统计量&#xff0c;常用的有均值、众数、中位数、百分位数等。1.均值 mean( )形式&#xff1a;mean(x, trim 0, na.rm FALSE)x 是对象(如向量、矩阵、数组或数据框)trim 是计…

npm环境安装linux,Node.js环境在linux上的部署教程

我们以centOS为例来说说如何部署node.js环境一 打开centos,然后开始下载node.js包curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -yum -y install nodejs二 安装gcc环境yum install gcc-c make安装完成!三 安装nodejs的npm,这是一个包程序工具,类似于…

Nancy跨平台开发总结(三)发布到Jexus Web服务器

在Centos7上安装Mono yum install yum-utils rpm --import "http://keyserver.ubuntu.com/pks/lookup?opget&search0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF" yum-config-manager --add-repo http://download.mono-project.com/repo/centos/ yum install m…

stat函数_数据分析工具入门 掌握这些Excel函数就够了

1.什么是函数可以把函数理解为一个可以控制的黑箱子&#xff0c;输入X到黑箱子中&#xff0c;他就会输出Y&#xff0c;参数就是黑箱子的控制开关&#xff0c;打到不同的档位&#xff0c;黑箱子会输出不同的Y。2.常见函数分类文本清洗函数关联匹配函数逻辑运算函数计算统计函数时…

mysql获取当前时间毫秒_MySQL性能指标及计算方法

是新朋友吗?记得先点蓝字关注我哦~ 今日课程菜单 Java全栈开发 | Web前端+H5 大数据开发 | 数据分析 人工智能+Python | 人工智能+物联网 来源:小职(z_zhizuobiao) 找我:✅ 解锁高薪工作 ✅ 免费获取干货教程 未 完 待 续 绝大多数MySQL性能指标可以通过以下两种方式获取:…

哈希查找

哈希查找之前&#xff0c;我们要弄清楚哈希技术&#xff0c;哈希技术是在记录的存储位置和记录的关键字之间建立一个确定的对应关系f&#xff0c;使得每个关键字key对应一个存储位置f(key)。查找时&#xff0c;根据这个确定的对应关系找到给定值的映射f(key),若查找集合中存在这…

fedora 安装Linux源码,如何在 Fedora 29/30 上安装 VS Code

Visual Studio Code 简称 VS Code 是微软开发的一款跨平台的源代码编辑器。 它具有内置的调试支持&#xff0c;嵌入式 Git 控件&#xff0c;语法突出显示&#xff0c;代码完成&#xff0c;代码重构和代码片段。Visual Studio Marketplace 提供了许多插件和扩展来扩展VS代码的功…

三菱伺服驱动器说明书_张家港市HG-KN13J-S100三菱伺服控制器

张家港市HG-KN13J-S100三菱伺服控制器MR-J2S1该产品还有RS-232和RS-422串行通讯功能&#xff0c;通过安装有伺服设置软件的个人计算机就能进行参数设定&#xff0c;试运行&#xff0c;状态显示和增益调整等操作。2与MR-J2S系列配套的伺服电机编码器采用了分辨率为131072脉冲/转…

Linux 禁用msi模式,通过禁用MSI模式解决Win10磁盘占用100%的方法

许多win10系统用户会在电脑中安装ssd固态硬盘&#xff0c;而在使用过程中经常会出现卡顿的情况&#xff0c;检查之后发现磁盘占用率100%&#xff0c;这是怎么回事呢&#xff0c;那么其实我们可以通过禁用MSI模式来解决&#xff0c;接下来给大家讲解一下通过禁用MSI模式解决Win1…

oracle jdbc jar包_Oracle总结之plsql编程(基础七)

紧接基础六&#xff0c;对oracle角色和权限的管理之后&#xff0c;在接下来的几次总结中来就最近工作中用过的plsql编程方面的知识进行总结&#xff0c;和大家分享&#xff01;一、plsql块1、只包括执行部分的plsql块打开输出选项&#xff1a;set serveroutput on&#xff1b;b…

Visual Studio调试之断点基础篇

原文链接地址&#xff1a;http://www.cnblogs.com/killmyday/archive/2009/09/26/1574311.html 我曾经问过很多人&#xff0c;你一般是怎么调试你的程序的&#xff1f; F9, F5, F11, F…… 有很多书和文章都是介绍怎么使用Visual Studio编写WinForm啦,、ASP.NET之类的程序&…

[译] ASP.NET 生命周期 – ASP.NET 请求生命周期(三)

使用特殊方法处理请求生命周期事件 为了在全局应用类中处理这些事件&#xff0c;我们会创建一个名称以 Application_ 开头&#xff0c;以事件名称结尾的方法&#xff0c;比如 Application_BeginRequest。举个例子&#xff0c;就像 Application_Start 和 Application_End 方法&a…

linux用while循环输出1到10,Linux Shell系列教程之(十一)Shell while循环 | Linux大学...

摘要在上一篇Linux Shell系列教程之(十)Shell for循环中&#xff0c;我们已经对Shell 循环语句的for循环进行了介绍&#xff0c;本篇给大家介绍下Shell 中另一种循环语句&#xff1a;Shell while循环。在上一篇Linux Shell系列教程之(十)Shell for循环中&#xff0c;我们已经对…

sqlserver 触发器 update_运维日记| SQL server 那点事——DML触发器

各位新朋友&#xff5e;记得先点蓝字关注我哦&#xff5e;11月19日&#xff0c;21点&#xff0c;小编正六指霸屏&#xff0c;决赛圈1V4&#xff0c;忽然&#xff0c;电话响了&#xff0c;这种感觉很熟悉&#xff0c;不错&#xff0c;上次差点推掉对面水晶的那一幕又上演了……作…

linux fb应用例子,Linux下利用framebuffer画点的程序小例子

Linux下利用framebuffer画点的程序小例子&#xff1a;/** ** Filename: framebuffer.c** Description: linux下利用framebuffer画点的程序小例子** Version: 1.0* Created: 2011年02月25日 10时33分29秒* Revision: none* Compiler: …