BZOJ 2004 公交线路(状压DP+矩阵快速幂)
注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压。
然后状压DP一下,用矩阵快速幂加速运算即可。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm> #define MAXN 140
#define MOD 30031 using namespace std; struct Matrix
{
int num[MAXN][MAXN];
int n,m; //n*m大小矩阵
void setOne(int a,int b)
{
n=a,m=b;
for(int i=;i<=min(n,m);i++) num[i][i]=;
}
Matrix() { memset(num,,sizeof(num)); }
}T,A,one; Matrix operator*(Matrix a,Matrix b)
{
Matrix c;
c.n=a.n,c.m=b.m;
for(int i=;i<=c.n;i++)
for(int j=;j<=c.m;j++)
for(int k=;k<=a.m;k++)
c.num[i][j]=(c.num[i][j]+a.num[i][k]*b.num[k][j])%MOD;
return c;
} Matrix fastPow(Matrix base,int pow)
{
Matrix ans;
ans.setOne(base.n,base.m);
while(pow)
{
if(pow&) ans=ans*base;
base=base*base;
pow>>=;
}
return ans;
} int calc(int x) //计算x的二进制中1的个数
{
int sum=;
while(x)
{
sum++;
x-=x&(-x); //x去掉最后一个1
}
return sum;
} int n,k,p,goal; //goal是目标状态 bool canConvert(int to,int from) //检查状态from能否一步转移到状态to
{
from=(from-(<<(p-)))<<; //这一步相当于把from向左推了一位,个位用0补齐
int tmp=from^to; //tmp应该只有一个1
if(tmp==(tmp&(-tmp))) return true; //tmp只有一个1,则是合法的
return false; //否则是不合法的
} int status[MAXN],top=; //保存所有DP过程中可能出现的状态的栈 int main()
{
scanf("%d%d%d",&n,&k,&p);
for(int S=(<<(p-));S<(<<p);S++) //枚举DP状态S,S是合法状态当且仅当S的二进制中1的个数恰好为k
{
if(calc(S)==k)
{
status[++top]=S;
if(S==(<<p)--((<<(p-k))-)) goal=top; //S是最终要达到的状态
}
}
for(int i=;i<=top;i++)
for(int j=;j<=top;j++)
if(canConvert(status[i],status[j]))
T.num[i][j]=;
A.n=A.m=T.n=T.m=top;
A.num[][goal]=;
T=fastPow(T,n-k);
A=A*T;
printf("%d\n",A.num[][goal]);
return ;
}
BZOJ 2004 公交线路(状压DP+矩阵快速幂)的更多相关文章
- 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂
[题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...
- BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )
状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...
- HDU 5434 Peace small elephant 状压dp+矩阵快速幂
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant Accepts: 38 Submissions: ...
- 【bzoj2004】[Hnoi2010]Bus 公交线路 状压dp+矩阵乘法
题目描述 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计 ...
- 『公交线路 状压dp 矩阵乘法加速』
公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的 ...
- [Bzoj2004][Hnoi2010]Bus 公交线路(状压dp&&矩阵加速)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 看了很多大佬的博客才理解了这道题,菜到安详QAQ 在不考虑优化的情况下,先推$dp ...
- BZOJ2004 HNOI2010公交线路(状压dp+矩阵快速幂)
由数据范围容易想到矩阵快速幂和状压. 显然若要满足一辆公交车的相邻站台差不超过p,则每相邻p个站台中每辆车至少经过一个站台.可以发现这既是必要的,也是充分的. 开始的时候所有车是相邻的.考虑每次把一辆 ...
- 【XSY2524】唯一神 状压DP 矩阵快速幂 FFT
题目大意 给你一个网格,每个格子有概率是\(1\)或是\(0\).告诉你每个点是\(0\)的概率,求\(1\)的连通块个数\(\bmod d=0\)的概率. 最开始所有格子的概率相等.有\(q\)次修 ...
- 2018.09.28 hdu5434 Peace small elephant(状压dp+矩阵快速幂)
传送门 看到n的范围的时候吓了一跳,然后发现可以矩阵快速幂优化. 我们用类似于状压dp的方法构造(1(1(1<<m)∗(1m)*(1m)∗(1<<m)m)m)大小的矩阵. 然后 ...
随机推荐
- 20155322 2017-2018-1《信息安全系统设计》第九周 Linux命令:pwd命令学习与简单实现
pwd命令学习 功能 Linux中用 pwd 命令来查看"当前工作目录"的完整路径. 格式 pwd [选项] 实例 用 pwd 命令查看默认工作目录的完整路径: 用 pwd 命令查 ...
- 2017-2018-1 20155329《信息安全技术》实验二——Windows口令破解
2017-2018-1 20155329<信息安全技术>实验二--Windows口令破解 实验原理 口令破解方法 字典破解: 指通过破解者对管理员的了解,猜测其可能使用某些信息作为密码,利 ...
- 实现Linux下dc的功能,计算后缀表达式的值
提交测试截图和码云练习项目链接,实现Linux下dc的功能,计算后缀表达式的值 -将运算符写在两个操作数之后的表达式称为"后缀表达式",如上面的中缀表达式可转换为后缀表达式1 2 ...
- SaltStack入门篇(一)之SaltStack部署
一.SaltStack概述 Salt,,一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯. salt底层采用动态的连接总线, ...
- Azkaban系统的安装和分析。
Azkaban系统是一个数据处理的很好用的工具,可以用来运行hadoop任务,管理hdfs,可以进行schedule任务调度,总体来说功能还是很强大的. 研究了一下azkaban,做了以下总结性的东西 ...
- (转) 转换Drupal7模块到Drupal8
转载地址:http://verynull.com/2015/11/02/Converting-7-x-modules-to-8-x/ 本节主要介绍如何把drupal7的模块转化为drupal8.参考资 ...
- idea alt+enter导包时被锁定导某一个包时的解决方法
在只有一个包指向的时候,把光标放在Test这种字符之间的话 就会直接导这个 所以把光标放在最后就可以导别的了
- 二、Django用户认证之cookie和session
1.cookie原理 Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制.目前Cookie已经成为标准,所有的主流浏览器如IE.Netscape.Firefox.O ...
- [备忘]Windows Server 2008 R2部署FTP FileZilla Server防火墙设置
有一台服务器,之前文件迁移少,现准备用FileZilla Server当FTP服务器,服务器系统是Windows Server 2008 R2,同样适用FileZilla Client连接服务器FTP ...
- 「日常训练」 Fire!(UVA-11624)
与其说是训练不如说是重温.重新写了Java版本的代码. import java.util.*; import java.math.*; import java.io.BufferedInputStre ...