【BZOJ2004】[Hnoi2010]Bus 公交线路

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

题解:看到P和K很小想到状压。用f[i][S]表示已经覆盖了前i个车站,每个车的位置的状态为S的方案数(S只包含前P个车站)。

由于n很大,考虑矩乘优化。我们将没有用的状态扔掉,最终矩阵大小是不超过$C_{10}^5\times C_{10}^5=252\times 252$的。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int P=30031;
int n,m,k,tot;
struct M
{int v[260][260];M () {memset(v,0,sizeof(v));}int * operator [] (int a) {return v[a];}M operator * (const M &a) const{M b;int i,j,k;for(i=1;i<=tot;i++)  for(j=1;j<=tot;j++)  for(k=1;k<=tot;k++)  b.v[i][j]=(b.v[i][j]+v[i][k]*a.v[k][j])%P;return b;}
}S,T;
int r[1<<10],cnt[1<<10];
inline void pm(int y)
{while(y){if(y&1)   S=S*T;T=T*T,y>>=1;}
}
int main()
{scanf("%d%d%d",&n,&k,&m);int i,j;for(i=1;i<(1<<m);i++){cnt[i]=cnt[i-(i&-i)]+1;if(cnt[i]==k)  r[i]=++tot;}for(i=1;i<(1<<m);i++)    if(r[i]){if(i&1)    T[r[i]][r[(i>>1)|(1<<(m-1))]]++;else  for(j=0;j<m;j++)  if((i>>j)&1)  T[r[i]][r[((i^(1<<j))>>1)|(1<<(m-1))]]++;}S[1][r[((1<<k)-1)<<(m-k)]]=1;pm(n-k);printf("%d",S[1][r[((1<<k)-1)<<(m-k)]]);return 0;
}

转载于:https://www.cnblogs.com/CQzhangyu/p/7965446.html

【BZOJ2004】[Hnoi2010]Bus 公交线路 状压+矩阵乘法相关推荐

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

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

  2. BZOJ 2004 [Hnoi2010]Bus 公交线路

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2004 题解 状压dp,记f[i][S]f[i][S]f[i][S]表示[1,i−p][1 ...

  3. 线性代数三之状压DP的矩阵加速——Quad Tiling,Bus公交线路

    状压与矩阵加速的藕断丝连 Quad Tiling description solution code [Hnoi2010]Bus 公交线路 description solution code Quad ...

  4. 【洛谷】P1357 花园(状压+矩阵快速幂)

    题目 传送门:QWQ 分析 因为m很小,考虑把所有状态压成m位二进制数. 那么总状态数小于$ 2^5 $. 如果状态$ i $能转移到$ j $,那么扔进一个矩阵,n次方快速幂一下. 答案是对角线之和 ...

  5. 【BZOJ2004】公交线路(动态规划,状态压缩,矩阵快速幂)

    [BZOJ2004]公交线路(动态规划,状态压缩,矩阵快速幂) 题面 BZOJ 题解 看到\(k,p\)这么小 不难想到状态压缩 看到\(n\)这么大,不难想到矩阵快速幂 那么,我们来考虑朴素的\(d ...

  6. [2021-07-19 内测NOIP] 操作(状压DP),异或(字典树),等级(线段树),矩阵(DP)

    [2021-07-19 内测] NOIP 操作 description solution code 异或 description solution code 等级 description soluti ...

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

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

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

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

  9. 【Codeforces Gym - 101635C Macarons 】【矩阵快速幂+状压】【dfs时间换空间】

    [链接] http://codeforces.com/gym/101635/attachments [题意] 求用1*1,1*2的方格填n*m的矩阵的方法数 [知识点] 状压dfs+矩阵快速幂 [分析 ...

最新文章

  1. 负载均衡器之 Haproxy
  2. 多分类神经网络与原子核
  3. linux和哪些主机配了互信,linux主机互信
  4. 送计算机教授教师节礼物,教师节送教授什么礼物好
  5. C语言内存字节对齐小结
  6. 硬件:选购CPU和显卡需了解的参数,TDP、SDP、ACP、GCP、TBP是什么?
  7. 计算机网络资料篇(一)——HTTP
  8. python wget 卡住_python – Paramiko在执行大型wget命令时挂起
  9. php面向对象编程调用结果,【PHP面向对象(OOP)编程入门教程】18.__call()处理调用错误...
  10. codeforces 460C - Present 二分加模拟
  11. spring init
  12. 云计算示范项目_“云计算和大数据”重点专项2018年度项目申报指南
  13. Packet Tracer官网下载
  14. 计算经纬度距离工具类
  15. Delphi IdHTTP1下载文件防止假死 ( - 大悟还俗
  16. 全网史上最全的AR学习开发资源汇总(转载他人整理作品,供参考)
  17. OpenGL-坐标系统,进入3D世界(深度测试)
  18. 自然辩证法问题思考范围(开卷可用)
  19. 2018版苹果开发者设置内购(App内购买项目)、税务、银行问题,开通苹果支付
  20. Mule ESB开发与学习

热门文章

  1. hadoop的Map阶段的四大步骤
  2. nio框架中的多个Selector结构
  3. 创建 floating IP - 每天5分钟玩转 OpenStack(106)
  4. highcharts第一篇---简介和使用
  5. Windows Mobile 编程 (Win32) - 获取设备能力
  6. tf.layers.dropout
  7. The selected server is enabled,but is not configured pro
  8. ping 不通 华为三层交换机vlan_华为三层交换机如何让VLAN间不能互通配置精编版...
  9. 嵌入式开发有年龄限制吗_什么?!考教资有年龄限制了?2020年我还能考吗?...
  10. 产品经理需要懂技术吗?懂到什么程度?