Description

小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km。 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计线路:
1.设共K辆公交车,则1到K号站作为始发站,N-K+1到N号台作为终点站。
2.每个车站必须被一辆且仅一辆公交车经过(始发站和终点站也算被经过)。 
3.公交车只能从编号较小的站台驶往编号较大的站台。 
4.一辆公交车经过的相邻两个
站台间距离不得超过Pkm。 在最终设计线路之前,小Z想知道有多少种满足要求的方案。由于答案可能很大,你只需求出答案对30031取模的结果。

Input

仅一行包含三个正整数N K P,分别表示公交车站数,公交车数,相邻站台的距离限制。
N<=10^9,1<P<=10,K<N,1<K<=P

Output

仅包含一个整数,表示满足要求的方案数对30031取模的结果。

Sample Input

样例一:10 3 3
样例二:5 2 3
样例三:10 2 4

Sample Output

1
3
81

HINT

【样例说明】
样例一的可行方案如下: (1,4,7,10),(2,5,8),(3,6,9)
样例二的可行方案如下: (1,3,5),(2,4) (1,3,4),(2,5) (1,4),(2,3,5)
P<=10 , K <=8

Solution

显然这个范围是要状压+矩乘……然后我就不会了
因为一个公交车经过的两个相邻的站台之间的距离不超过$p$,所以设$f[i][S]$表示最靠左的车在$i$位置,$i$后面$p$个位置的状态是$S$,其中$S$的某一位是0代表没车,1代表有车。
这相当于我们把这$k$辆车都放到一个长度为$p$的区间内来做。因为车没有编号所以我们并不需要区分。
然后状态数最大只有$C(9,4)$,所以可以预处理出所有状态可以到达的状态然后矩阵转移……$f[i][S]=\sum f[i-1][S']$,其中$S'$状态可以转移到$S$。
初始状态为长度为$p$的区间左边一段都是1,终止状态也是。

Code

 #include<iostream>
#include<cstring>
#include<cstdio>
#define MOD (30031)
using namespace std; int n,k,p,S[],cnt,Refun; struct Matrix
{
int m[][];
Matrix(){memset(m,,sizeof(m));}
Matrix operator * (const Matrix b) const
{
Matrix ans;
for (int i=; i<=; ++i)
for (int j=; j<=; ++j)
for (int k=; k<=; ++k)
(ans.m[i][j]+=m[i][k]*b.m[k][j])%=MOD;
return ans;
}
}A,G; Matrix Qpow(Matrix a,int p)
{
Matrix ans;
for (int i=; i<=; ++i) ans.m[i][i]=;
while (p)
{
if (p&) ans=ans*a;
a=a*a; p>>=;
}
return ans;
} int Get(int x)//二进制下1的数量
{
int num=;
while (x) num+=(x&),x>>=;
return num;
} bool check(int x,int y)//判断x状态是否能到达y状态
{
int now=S[x]<<, tmp=;
for (int i=; i<p; ++i)
if ((now&(<<i))!=(S[y]&(<<i))) tmp++;
return tmp<=;
} int main()
{
scanf("%d%d%d",&n,&k,&p);
for (int i=<<(p-); i<=(<<p)-; ++i)//强制第一位有车
if (Get(i)==k)
{
S[++cnt]=i;
if (S[cnt]==(<<p)-(<<p-k)) Refun=cnt;//记录车都在起点/终点的状态
}
A.m[][Refun]=;
for (int i=; i<=cnt; ++i)
for (int j=; j<=cnt; ++j)
if (check(i,j)) G.m[i][j]=;
G=Qpow(G,n-k);
A=A*G;
printf("%d\n",A.m[][Refun]);
}

BZOJ2004:[HNOI2010]Bus 公交线路(状压DP,矩阵乘法)的更多相关文章

  1. 【bzoj2004】[Hnoi2010]Bus 公交线路 状压dp+矩阵乘法

    题目描述 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计 ...

  2. [Bzoj2004][Hnoi2010]Bus 公交线路(状压dp&&矩阵加速)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 看了很多大佬的博客才理解了这道题,菜到安详QAQ 在不考虑优化的情况下,先推$dp ...

  3. 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂

    [题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...

  4. 『公交线路 状压dp 矩阵乘法加速』

    公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的 ...

  5. 【BZOJ2004】[Hnoi2010]Bus 公交线路 状压+矩阵乘法

    [BZOJ2004][Hnoi2010]Bus 公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1 ...

  6. BZOJ 2004 公交线路(状压DP+矩阵快速幂)

    注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...

  7. BZOJ2004: [Hnoi2010]Bus 公交线路

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2004 状压dp+矩阵乘法. f[i][s]表示从第i位至前面的i-k位,第i位必须取的状态. ...

  8. bzoj2004 [Hnoi2010]Bus 公交线路 矩阵快速幂+状压DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2004 题解 如果 \(N\) 没有那么大,考虑把每一位分配给每一辆车. 假设已经分配到了第 \ ...

  9. [BZOJ 2004] [Hnoi2010] Bus 公交线路 【状压DP + 矩阵乘法】

    题目链接: BZOJ - 2004 题目分析 看到题目完全不会..于是立即看神犇们的题解. 由于 p<=10 ,所以想到是使用状压.将每个连续的 p 个位置压缩成一个 p 位 2 进制数,其中共 ...

随机推荐

  1. vs2015编译时CS1056 C# Unexpected character解决办法

    https://stackoverflow.com/questions/42932577/error-cs1056-unexpected-character-running-the-msbuild-o ...

  2. Xss和Csrf介绍

    Xss和Csrf介绍 Xss Xss(跨站脚本攻击),全称Cross Site Scripting,恶意攻击者向web页面中植入恶意js代码,当用户浏览到该页时,植入的代码被执行,达到恶意攻击用户的目 ...

  3. thinkphp htmlspecialchars_decode

    一  百度编辑器 与 htmlspecialchars_decode *Thinkphp百度编辑器 存的时候为了安全把进行了字符转换,数据库: <p>&nbsp;测试测试</ ...

  4. Autocomplete 自动提示

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  5. Android Studio下载/更新SDK

    今天安装配置Android Studio的时候,用SDK Manager下载SDK的时候只显示了一个7.0,别的都刷新不出来(被墙了).去网上搜索怎么解决,发现很多帖子的方法已经过时了(跟现在的AS版 ...

  6. Oracle数据库基本操作 (六) —— 数据的导出与导入

    一.cmd 下登录oracle数据库下的指定用户 方式一:命令行明文连接登录 打开cmd,输入:sqlplus/nolog 输入:conn username/passworld@数据库实例名 方式二: ...

  7. sql: MySQL and Microsoft SQL Server Stored Procedures IN, OUT using csharp code

    MySQL存储过程: #插入一条返回值涂聚文注 DELIMITER $$ DROP PROCEDURE IF EXISTS `geovindu`.`proc_Insert_BookKindOut` $ ...

  8. Android学习笔记(2)----LocationManager的使用

    今天使用Android的LocationManager制作了一款获取当前经纬坐标位置的软件. LocationManager获取的只是经纬坐标点,为了解析出当前经纬坐标点的实际位置,可以使用Googl ...

  9. FineReport和泛微OA(Ecology)的单点登录集成方案

    最近出现了很多关于帆软报表和泛微OA的集成问题,均出现在“单点登录”上.直接也有相关的文章介绍一些FineReport和泛微集成的背景.价值等,以及FineReport和OA的深度集成的方案,但是并没 ...

  10. spring boot(8)-mybatis三种动态sql

    脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...