bzoj2004
反正N<=10^9肯定是矩阵乘法
反正p<=10肯定是状压dp
首先有一个非常重要的性质是任意连续P个站,必须保证K辆车必须停在其中的一个站
我们设f[i,S]表示到第i个站搞定了后,这K辆公交车停靠的站的状态集合为S的方案数
由于公交车之间是等价的,因此我们只要知道这K辆公交车离当前站的距离(∈[0,p-1])
显然这有一辆肯定距离当前站距离为0,剩下的k-1辆的距离显然在[1,p-1]中组合
可知状态数为C(k-1,p-1),不难发现状态数最多是C(5,9)=126
由此可以得到f[i,s]=∑f[i-1,s']
显然我们可以弄出转移矩阵然后矩乘加速
const mo=; var w:array[..,..] of boolean;
v:array[..] of boolean;
a,b,c,d:array[..,..] of longint;
ch,m,n,k,p,i,j,h,ans:longint; procedure mul;
var i,j,k:longint;
begin
for i:= to m do
for j:= to m do
begin
c[i,j]:=;
for k:= to m do
c[i,j]:=(c[i,j]+a[i,k]*b[k,j]) mod mo;
end;
end; procedure dfs(x,t:longint);
var i:longint;
begin
if (p-x<k-t) then exit;
if t=k+ then
begin
inc(m);
w[m]:=v;
end;
for i:=x to p do
begin
v[i]:=true;
dfs(i+,t+);
v[i]:=false;
end;
end; procedure quick(n:longint);
var t,i,x:longint;
begin
x:=n;
t:=;
while x<> do
begin
inc(t);
x:=x shr ;
end;
for i:=t- downto do
begin
a:=c;
b:=c;
mul;
if ( shl i) and n<> then
begin
a:=c;
b:=d;
mul;
end;
end;
end; begin
readln(n,k,p);
v[]:=true;
dfs(,); //搜出所有状态
for i:= to m do
for j:= to m do
begin
ch:=;
for h:= to p do
if w[i,h] and not w[j,h+] then //有一辆有停靠在当前站
begin
dec(ch);
if ch< then break;
end;
if ch= then d[j,i]:=;
end; n:=n-k;
for i:= to m do
c[i,i]:=;
quick(n);
writeln(c[,] mod mo);
end.
bzoj2004的更多相关文章
- 【BZOJ2004】公交线路(动态规划,状态压缩,矩阵快速幂)
[BZOJ2004]公交线路(动态规划,状态压缩,矩阵快速幂) 题面 BZOJ 题解 看到\(k,p\)这么小 不难想到状态压缩 看到\(n\)这么大,不难想到矩阵快速幂 那么,我们来考虑朴素的\(d ...
- BZOJ2004 HNOI2010公交线路(状压dp+矩阵快速幂)
由数据范围容易想到矩阵快速幂和状压. 显然若要满足一辆公交车的相邻站台差不超过p,则每相邻p个站台中每辆车至少经过一个站台.可以发现这既是必要的,也是充分的. 开始的时候所有车是相邻的.考虑每次把一辆 ...
- 【BZOJ2004】[Hnoi2010]Bus 公交线路 状压+矩阵乘法
[BZOJ2004][Hnoi2010]Bus 公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1 ...
- 【BZOJ2004】[HNOI2010]Bus 公交线路
[BZOJ2004][HNOI2010]Bus 公交线路 题面 bzoj 洛谷 题解 $N$特别大$P,K$特别小,一看就是矩阵快速幂+状压 设$f[S]$表示公交车状态为$S$的方案数 这是什么意思 ...
- BZOJ2004: [Hnoi2010]Bus 公交线路
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2004 状压dp+矩阵乘法. f[i][s]表示从第i位至前面的i-k位,第i位必须取的状态. ...
- bzoj2004 矩阵快速幂优化状压dp
https://www.lydsy.com/JudgeOnline/problem.php?id=2004 以前只会状压dp和矩阵快速幂dp,没想到一道题还能组合起来一起用,算法竞赛真是奥妙重重 小Z ...
- bzoj2004(矩阵快速幂,状压DP)
每个长度为p的区间都必须出现k次1,数据又很小,我们使用状压. dp[i][j]->dp[i+1][j'],dp[i][j]表示当前考虑到了第i个车站,包括第i个其后的p个的状态(有车停或没车停 ...
- bzoj2004公交线路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 好美妙的矩阵乘. 思考: 0.在一个序列上.所以考虑dp. 1.p<=10,k& ...
- BZOJ2004:[HNOI2010]Bus 公交线路(状压DP,矩阵乘法)
Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定 ...
随机推荐
- com.sun.org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException
在日志中, 查看导入的包是否是 import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;
- javascript 之封装技巧
技术--- 闭包 javascript中的对象属性都是公开的,外界都可访问到,例: function cat(){ this.name = '猫'; this.climb = function(){ ...
- 关于iOS上的静态库
最近再进行项目的真机调试,然后发现了一个天坑.就此研究了一些iOS上的静态库的使用: 首先我们是直接拿一个可以运行的项目来制作静态库的,网上大部分都是先创建静态库然后再写内容,看看我的方法. 1.把子 ...
- VB,VBS,VBA,ASP可引用的库参考
文件系统对象相关: ("SCRIPTING.FILESYSTEMOBJECT") 字典相关: ("SCRIPTING.DICTIONARY") 脚本外壳相关: ...
- MinGW-notepad++开发c/c++程序
下载MinGW 点击下载 安装好后运行 最后点击左上角的 Installation,开始安装 1.编译: g++ -o a.exe a.cpp gcc -o hello.exe hello.c 2.运 ...
- C语言——打印魔方阵(每一行,每一列,对角线之和相等)
<一>魔方阵说明: 魔方阵是一个N*N的矩阵: 该矩阵每一行,每一列,对角线之和都相等: <二>魔方阵示例: 三阶魔方阵: 8 1 6 3 5 7 4 9 ...
- libsdl中文输入法候选列表不显示解决方案
libsdl输入中文时输入法不显示,将WM_IME_SETCONTEXT事件处理给注释即可. WM_IME_SETCONTEXT If the application draws the compos ...
- (转)Libevent(1)— 简介、编译、配置
转自:http://name5566.com/4190.html 参考文献列表:http://www.wangafu.net/~nickm/libevent-book/ 此文编写的时候,使用到的 Li ...
- 高性能、高并发TCP服务器(多线程调用libevent)
from:http://blog.csdn.net/i_am_jojo/article/details/7587838 本文讲述的TCP服务器是模仿memcache中的TCP网络处理框架,其中是基于l ...
- 列表字体css
white-space: nowrap; text-overflow: ellipsis; -o-text-overflow: ellipsis; overflow: hidden;