[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) - ...
随机推荐
- Docker学习之Docker容器基本使用
Docker学习之Docker容器基本使用 新建容器并启动 命令格式:docker run --options repository:tag 后台运行 命令格式:-d 已存在的容器相关操作 启动:do ...
- aabb问题
输出所有aabb型的完全平方数 这个问题主要是提供一个判断完全平方的思路,就是用floor函数 #include <iostream> #include <string> #i ...
- 微软2016校园招聘在线笔试-Professor Q's Software
题目2 : Professor Q's Software 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Professor Q develops a new softw ...
- Spring与Web整合
一 概述 1.整合目的 将所有对象的创建与管理任务交给Spring容器,降低程序的耦合度. 2.整合途径 将Spring容器注入到Web容器中. 3.具体实现 使用ServletContextList ...
- javascript变量的引用类型值
JavaScript变量可以用来保存俩种类型的值:基本类型和引用类型值 前言 JS变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型的值源自一下5种基本数据类型:Underfined.Nu ...
- 通过vertical-align属性实现“竖向居中”显示
自学编程大概有大半年的时间了,从15年7月开始学习使用人数最多的JAVA,到后来喜欢上了前端,但由于之间在建筑设计院的工作加班颇为频繁,每天刨去工作,基本没有多少自己个人的时间,只能每天6,7点起床, ...
- Storage 的使用
//是否不支持storage isNoStorage: function(){ if(typeof(Storage)=="function" || window.sessionSt ...
- 【javascript】javascript设计模式之工厂模式
1.要解决的问题 2.如何实现 3.与构造函数的区别 4.总结 1.要解决的问题 工厂模式通常用于重复创建相似对象,提供动态创建对象的接口. 2.工厂模式最为设计模式中构造模式之一,通常在类或类的静态 ...
- linux下C语言三种get输入方式
第一种:scanf() #include "stdio.h" #include "string.h" int main() { ]; scanf("% ...
- php下载远程大文件(获取远程文件大小)
function download_file($url) { // $url = http://192.168.8.95/vm/download_file?downurl=http://192.168 ...