[HNOI2010]公交线路
发现\(n\)比较大,但是\(k,p\)都很小,考虑矩乘使得复杂度倾斜一下
发现所有车的最大间隔都是\(p\),还保证\(k<p\),于是我们可以考虑压下最后\(p\)位的情况
于是设\(dp[i][S]\)表示目前最远的车来到了\(i\)位置,最后\(p\)为是否有车的状态是\(S\),\(0\)表示没车,\(1\)表示有车
转移的话我们就使得某一辆车提前就好了,注意如果\(i-p+1\)有车的话,提前的只能是这辆车了
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
const int M=1024;
const int mod=30031;
struct mat{int a[255][255];}a;
int n,K,P,sz;
int id[M],to[M];
inline mat operator*(mat a,mat b) {
mat c;
for(re int i=0;i<sz;i++)
for(re int j=0;j<sz;j++) c.a[i][j]=0;
for(re int k=0;k<sz;k++)
for(re int i=0;i<sz;i++)
for(re int j=0;j<sz;j++) {
c.a[i][j]+=a.a[i][k]*b.a[k][j];
if(c.a[i][j]>mod) c.a[i][j]%=mod;
}
return c;
}
mat ksm(int b) {
mat S=a;b--;
while(b) {if(b&1) S=S*a;b>>=1;a=a*a;}
return S;
}
void dfs(int t,int s,int num) {
if(t==P+1) {
if(num==K) id[sz]=s,to[s]=sz++;
return;
}
dfs(t+1,s,num);
dfs(t+1,s|(1<<(t-1)),num+1);
}
int main() {
scanf("%d%d%d",&n,&K,&P);
dfs(1,0,0);
for(re int i=0;i<sz;i++) {
int now=id[i];
for(re int j=0;j<P;j++)
if(now>>j&1) {
if((now>>(P-1)&1)&&j!=P-1) continue;
a.a[to[(now^(1<<j))<<1|1]][i]++;
}
}
int k=(1<<K)-1;
mat ans=ksm(n-K);
printf("%d\n",ans.a[to[k]][to[k]]);
return 0;
}
[HNOI2010]公交线路的更多相关文章
- bzoj2004 [Hnoi2010]公交线路
Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距 离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决 ...
- BZOJ2004 HNOI2010公交线路(状压dp+矩阵快速幂)
由数据范围容易想到矩阵快速幂和状压. 显然若要满足一辆公交车的相邻站台差不超过p,则每相邻p个站台中每辆车至少经过一个站台.可以发现这既是必要的,也是充分的. 开始的时候所有车是相邻的.考虑每次把一辆 ...
- 洛谷 P3204 [HNOI2010]公交线路
题面 luogu 题解 矩阵快速幂\(+dp\) 其实也不是很难 先考虑朴素状压\(dp\) \(f[i][S]\) 表示最慢的车走到了\(i\),\([i, p+i-1]\)的覆盖情况 状态第一位一 ...
- [HNOI2010] 公交线路 bus
标签:状态压缩+矩阵快速幂. 题解: 首先看范围,p<=10,那么我们可以想到状态压缩.我们把从一个长度为10的区间进行压缩,1代表可以,那么当值一个区间的1的个数为k个,我们就认为他是合法的. ...
- 【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$的方案数 这是什么意思 ...
- AMap公交线路查询
<!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...
- Android百度地图开发(五)公交线路详情搜索、多条线路显示
一.公交线路详情检索 获取公交线路的详情主要分来两步,1.获取公交线路的Uid,2.通过Uid获取公交线路详情. 1.获取公交线路的Uid: /* * 获得公交线路图的Uid,并且根据系Uid发起公交 ...
- 济南最新公交线路一览(BRT)
济南最新公交线路一览(BRT) 济南BRT1路 高速公交线路 黄岗路东5:30-21:30 全福立交桥西5:30-21:30 票价1元,刷卡9折,月票有效 高速公交公司 去程:黄岗路东(BRT) - ...
随机推荐
- VS中让用户选择路径
//选择文件 OpenFileDialog ofd = new OpenFileDialog(); ofd.ShowDialog(); MessageBox.Show(ofd.FileName); / ...
- flask笔记三:flask-login插件的使用
flask-login插件的使用 安装: pip install flask-login 初始化LoginManager ##############LoginManager设置########### ...
- 十三、curator recipes之SharedCounter
简介 我们可以通过curator实现对一个分布式环境下共享变量的访问,zookeeper将共享变量维护在同一个路径下. 官方文档:http://curator.apache.org/curator-r ...
- redisTemplate 总结
依赖jar包 jackson <dependency> <groupId>com.fasterxml.jackson.core</groupId> <arti ...
- Java实现类似类似百度搜索模糊关键字
package com.test; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashM ...
- 局域网内使用ipv6 通信
链路本地地址:用于网段内通信,不能跨路由访问 在ping本地链路地址和全球唯一地址时有点差别,链路本地地址需要加上网络接口号 Linux 查看ipv6链路本地地址:ifconfig linux系统pi ...
- K:大数加法
相关介绍: 在java中,整数是有最大上限的.所谓大数是指超过整数最大上限的数,例如18 452 543 389 943 209 789 324 233和8 123 534 323 432 323 ...
- OpenStack IceHouse 部署 - 2 - 网络与软件环境初始化
OpenStack应用:节点软硬件环境配置 节点硬件与IP分配 实验室网关 10.14.39.1 各个节点 节点名称 硬件(Linux硬盘分区,RAM,CPU) ip地址(接口) 作用与运行的服 ...
- HTML基本结构及标签样式
<!DOCTYPE html>————声明 <html> <head>————头部设置信息 <title>文件标题</title> < ...
- csharp: Linq keyword example
/// <summary> /// http://www.dotnetperls.com/linq /// </summary> public partial class Li ...