由数据范围容易想到矩阵快速幂和状压。

  显然若要满足一辆公交车的相邻站台差不超过p,则每相邻p个站台中每辆车至少经过一个站台。可以发现这既是必要的,也是充分的。

  开始的时候所有车是相邻的。考虑每次把一辆公交车塞到前方第一个未到达的站台。这个时候公交车之间是没有区别的,因为只要保证每相邻p个站台每辆车都出现也即有k辆车就可以了。

  于是设f[i][j]为i-p+1~i的车站停靠状况为j的方案数。并且表示i站台状况的这一位必为1,j中一共有k个1。于是状态数至多有C(9,4)=126种。转移比较显然,只要由这个状态开一辆车能到下个状态就可以了。

  每次转移都是相同的,那么矩阵快速幂即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define P 30031
#define N 130
struct matrix
{
int n,a[N][N];
matrix operator *(const matrix&b) const
{
matrix c;c.n=n;
for (int i=;i<n;i++)
for (int j=;j<b.n;j++)
c.a[i][j]=;
for (int i=;i<n;i++)
for (int j=;j<b.n;j++)
for (int k=;k<b.n;k++)
c.a[i][j]=(c.a[i][j]+a[i][k]*b.a[k][j])%P;
return c;
}
}f,d;
int n,k,p,id[N],m;
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj2004.in","r",stdin);
freopen("bzoj2004.out","w",stdout);
const char LL[]="%I64d";
#else
const char LL[]="%lld";
#endif
n=read(),k=read(),p=read();
for (int i=<<p-;i<(<<p);i++)
{
int t=i,cnt=;
while (t) cnt+=t&,t>>=;
if (cnt==k) id[m++]=i;
}
d.n=m;
for (int i=;i<m;i++)
for (int j=;j<m;j++)
{
int x=(id[j]&(<<p-)-)<<^id[i];
if (x==(x&-x)) d.a[i][j]=;
}
f.n=;
f.a[][m-]=;
n-=k;
while (n)
{
if (n&) f=f*d;
n>>=;
d=d*d;
}
cout<<f.a[][m-];
return ;
}

BZOJ2004 HNOI2010公交线路(状压dp+矩阵快速幂)的更多相关文章

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

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

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

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

  3. HDU 5434 Peace small elephant 状压dp+矩阵快速幂

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant  Accepts: 38  Submissions: ...

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

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

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

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

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

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

  7. BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )

    状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...

  8. 【XSY2524】唯一神 状压DP 矩阵快速幂 FFT

    题目大意 给你一个网格,每个格子有概率是\(1\)或是\(0\).告诉你每个点是\(0\)的概率,求\(1\)的连通块个数\(\bmod d=0\)的概率. 最开始所有格子的概率相等.有\(q\)次修 ...

  9. 2018.09.28 hdu5434 Peace small elephant(状压dp+矩阵快速幂)

    传送门 看到n的范围的时候吓了一跳,然后发现可以矩阵快速幂优化. 我们用类似于状压dp的方法构造(1(1(1<<m)∗(1m)*(1m)∗(1<<m)m)m)大小的矩阵. 然后 ...

随机推荐

  1. Selenium:WebDriver简介及元素定位

    参考内容:官方API文档,下载链接:http://download.csdn.net/detail/kwgkwg001/4004500 虫师:<selenium2自动化测试实战-基于python ...

  2. openssl生成签名与验证签名

    继上一篇RSA对传输信息进行加密解密,再写个生成签名和验证签名. 一般,安全考虑,比如接入支付平台时,请求方和接收方要互相验证是否是你,就用签名来看. 签名方式一般两种,对称加密和非对称加密.对称加密 ...

  3. 字符串阵列String[]转换为整型阵列Int[]

    原始数据: string input = "3,7,2,8,1,9,1,34,67,78,22"; 要处理为: " }; 最终处理为: , , , , , , , , , ...

  4. [Spark][Hive]Hive的命令行客户端启动:

    [Spark][Hive]Hive的命令行客户端启动: [training@localhost Desktop]$ chkconfig | grep hive hive-metastore 0:off ...

  5. 案例学Python--案例四:Django实现一个网站的雏形(1)

    第一次用python的Web框架,也是第一次听说Django,参考菜鸡教程和一些博客,倒腾了半天,算是有一个雏形.数据基于昨天爬的豆瓣电影信息,详见案例三. Python版本:3.7.1 Django ...

  6. vs2017+opencv4.0.1安装配置详解(win10)

    一.说明 笔者之前已经安装过了vs2017,对应的opencv是3.4.0版本的.但现在想体验下opencv4的改变之处,所以下载了最新的opencv4.0.1. vs2017的安装请自行搜索安装,本 ...

  7. PHP从入门到精通(六)

    PHP中的错误处理 1.PHP的错误级别:见表格.2.调整PHP错误报告级别:PHP中,调整错误报告级别的方式有两种: ①修改PHP.ini文件的配置项.a.会导致在当前服务器环境下所有PHP文件都受 ...

  8. OC与JS的交互(iOS与H5混编)

    大神总结WKWebView的坑:https://mp.weixin.qq.com/s/rhYKLIbXOsUJC_n6dt9UfA 在开发过程中,经常会出现需要iOS移动端与H5混编的使用场景. iO ...

  9. mybatis中批量更新的问题

    问题:使用mybatis在执批量更新操作时,一直报错执行失败 解决方法: 首先打印了SQL语句,发现SQL语句拿出来执行没问题,也可以批量执行.SQL没问题,应该是配置的问题. 在网上查询和很多资料, ...

  10. QT 子窗口退出全屏

    m_pWidget代表子窗口, 子窗口显示全屏: m_pWidget->setWindowFlags(Qt::Dialog); m_pWidget->showFullScreen(); 子 ...