【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂
【题意】n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n。给定n,k,p,求满足要求的方案数%30031。n<=10^9,k<=p<=10。
【算法】状压DP+矩阵快速幂
【题解】开始没看到p<=10,其实很显然p>k的话第一车就不满足要求了。考虑相邻停靠点没有关键信息,只能状压。
因为车都是从头开到尾的,所以直接考虑i~i-p+1的公车停靠状态就行了(i-p和i的距离为p,也就是必须跳到i,因此考虑i-p没有意义)。
设$f[i][S]$表示考虑第i个位置(最快的车可能到i),i~i-p+1的公车停靠状态为S的方案数,并且强制S的最低位为1(从前往后从低到高)。
$$f[i][S]=\sum f[i-1][S']$$
将S右移一位,然后枚举0~p中没有1的位置插入一个1得到的就是合法的S‘,然后把所有状态放在矩阵中就可以快速幂n-k次了。
注意到S是有效状态当且仅当S中含有恰好k个1,所以预处理合法状态数是C(p,k)的,这样复杂度就可以保证了。
总复杂度O(C(p,k)^3*log n)。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,MOD=;
int n,k,p,tot,c[N][N],q[N*],A[N][N],ANS[N][N];
void multply(int a[N][N],int b[N][N]){
for(int i=;i<=tot;i++){
for(int j=;j<=tot;j++){
c[i][j]=;
for(int k=;k<=tot;k++){
c[i][j]=(c[i][j]+a[i][k]*b[k][j])%MOD;
}
}
}
for(int i=;i<=tot;i++)for(int j=;j<=tot;j++)b[i][j]=c[i][j];
}
int main(){
scanf("%d%d%d",&n,&k,&p);
for(int S=;S<(<<p);S++)if(S&){
int num=;
for(int i=;i<p;i++)if(S&(<<i))num++;
if(num!=k)continue;
tot++;q[S]=tot;
}
for(int S=;S<(<<p);S++)if(q[S]){
int s=S>>;
for(int i=;i<p;i++)if(!(s&(<<i))&&q[s|(<<i)])A[q[S]][q[s|(<<i)]]=;//
}
n-=k;
int s=(<<k)-;
ANS[q[s]][]=;
while(n){
if(n&)multply(A,ANS);
multply(A,A);
n>>=;
}
s=(<<k)-;
printf("%d",ANS[q[s]][]);
return ;
}
【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂的更多相关文章
- 【bzoj2004】[Hnoi2010]Bus 公交线路  状压dp+矩阵乘法
		
题目描述 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计 ...
 - [Bzoj2004][Hnoi2010]Bus 公交线路(状压dp&&矩阵加速)
		
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 看了很多大佬的博客才理解了这道题,菜到安详QAQ 在不考虑优化的情况下,先推$dp ...
 - BZOJ 2004 公交线路(状压DP+矩阵快速幂)
		
注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...
 - BZOJ2004:[HNOI2010]Bus 公交线路(状压DP,矩阵乘法)
		
Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定 ...
 - HDU 5434 Peace small elephant 状压dp+矩阵快速幂
		
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant Accepts: 38 Submissions: ...
 - 【BZOJ2004】[Hnoi2010]Bus 公交线路 状压+矩阵乘法
		
[BZOJ2004][Hnoi2010]Bus 公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1 ...
 - BZOJ2004 HNOI2010公交线路(状压dp+矩阵快速幂)
		
由数据范围容易想到矩阵快速幂和状压. 显然若要满足一辆公交车的相邻站台差不超过p,则每相邻p个站台中每辆车至少经过一个站台.可以发现这既是必要的,也是充分的. 开始的时候所有车是相邻的.考虑每次把一辆 ...
 - 『公交线路 状压dp 矩阵乘法加速』
		
公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的 ...
 - BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )
		
状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...
 
随机推荐
- Eclipse项目导入到Android Studio中
			
背景 最近需要将Eclipse中的android项目导入到Android Studio中!倒腾一番,记录如下! 步骤1 打开Android Studio(下文称AS),选择Import project ...
 - 奇异值分解(SVD)原理详解及推导 (转载)
			
转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/43053513 在网上看到有很多文章介绍SVD的,讲的也都不错,但是感觉还是有 ...
 - Delphi实现ERP单据列表栏目设置
			
什么都不用说了,ERP你懂的.一张报表,不同的客户都可以调死你.直接上图 通过这个设置界面,直接生成参数调整报表所用的DBGridEh.对,是DBGridEh,不是DBGrid,也不是CXGrid. ...
 - ie浏览器升级的正确姿势
			
一.版本说明 1.当前IE浏览器分为一下几个版本:IE 6,IE 7,IE 8,IE 9,IE 10,IE 11 2.windows最高支持IE版本win xp:IE 8win 7 :IE 11win ...
 - 第179天:javascript中replace使用总结
			
ECMAScript提供了replace()方法.这个方法接收两个参数,第一个参数可以是一个RegExp对象或者一个字符串,第二个参数可以是一个字符串或者一个函数.现在我们来详细讲解可能出现的几种情况 ...
 - 【前端】JS截取字符串常用方法详细整理
			
函数:split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组 例子: str=”jpg|bmp|gif|ico|png”; arr=theString.split(”|”); //arr ...
 - 【EF】Entity Framework Core 软删除与查询过滤器
			
本文翻译自<Entity Framework Core: Soft Delete using Query Filters>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 注意 ...
 - 【uoj#48】[UR #3]核聚变反应强度  数论
			
题目描述 给出一个长度为 $n$ 的数列 $a$ ,求 $a_1$ 分别与 $a_1...a_n$ 的次大公约数.不存在则输出-1. 输入 第一行一个正整数 $n$ . 第二行 $n$ 个用空格隔开的 ...
 - [十七]SpringBoot 之 使用自定义的properties
			
Springboot使用application.properties默认了很多配置.但需要自己添加一些配置的时候,我们应该怎么做呢. 如果继续在application.properties中添加 如: ...
 - 【比赛】HNOI2018 道路
			
这题很考思维啊,考验我们能否快速从省选难度跳转到普及难度 考试的时候真的想得太多,觉得省选不可能这么简单吧,然后就打脸 设 \(f[i][j][x]\) 表示从根到 \(x\) 号点,有 \(i\) ...