题目链接

https://www.lydsy.com/JudgeOnline/problem.php?id=2004

题解

状压dp,记f[i][S]f[i][S]f[i][S]表示[1,i−p][1,i-p][1,i−p]的车都被安排好了,而[i−p+1,i][i-p+1,i][i−p+1,i]的车中,SSS中有111的位置都安排有车停,并且恰好只有kkk个位置安排了(就是kkk辆车安排到的最后一个站,按照定义,显然kkk辆车安排的终点站必定在[i−p+1,i][i-p+1,i][i−p+1,i]内),其他的都没有安排。为了防止重复统计,钦定SSS的最高位(i−p+1i-p+1i−p+1)必定为111。

转移的话就是,如果f[i][S]f[i][S]f[i][S]与f[i−1][T]f[i-1][T]f[i−1][T],TTT中的所有111与SSS中的所有111能对应上,那么f[i][S]f[i][S]f[i][S]就可以从f[i−1][T]f[i-1][T]f[i−1][T]转移过来。

由于状态总数为(nn/2)\binom{n}{n/2}(n/2n​)(最大是126),因此可以用矩阵乘法加速转移。

代码

#include <cstdio>
#include <cstring>int read()
{int x=0,f=1;char ch=getchar();while((ch<'0')||(ch>'9')){if(ch=='-'){f=-f;}ch=getchar();}while((ch>='0')&&(ch<='9')){x=x*10+ch-'0';ch=getchar();}return x*f;
}const int maxm=126;
const int mod=30031;struct matrix
{int n,m,a[maxm+2][maxm+2];matrix operator *(const matrix &other) const{matrix res;res.n=n;res.m=other.m;memset(res.a,0,sizeof res.a);for(int i=1; i<=n; ++i){for(int j=1; j<=other.m; ++j){for(int k=1; k<=m; ++k){res.a[i][j]=(res.a[i][j]+1ll*a[i][k]*other.a[k][j])%mod;}}}return res;}
};int stand[maxm+2],n,p,k,tot;
matrix start,trans,ans;matrix quickpow(matrix res,matrix a,int b)
{while(b){if(b&1){res=res*a;}a=a*a;b>>=1;}return res;
}int main()
{n=read();p=read();k=read();for(int i=1<<(k-1); i<1<<k; ++i){int cnt=0;for(int j=0; j<k; ++j){if(i&(1<<j)){++cnt;}}if(cnt==p){stand[++tot]=i;}}start.n=1;start.m=trans.n=trans.m=tot;for(int i=1; i<=tot; ++i){for(int j=1; j<=tot; ++j){int r=(stand[i]<<1)&((1<<k)-1),q=stand[j];for(int s=0; s<k; ++s){if(((r&(1<<s))==0)&&((r|(1<<s))==q)){trans.a[j][i]=1;}}}}start.a[1][tot]=1;ans=quickpow(start,trans,n-p);printf("%d\n",ans.a[1][tot]);return 0;
}

转载于:https://www.cnblogs.com/Canopus-wym/p/10376137.html

BZOJ 2004 [Hnoi2010]Bus 公交线路相关推荐

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

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

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

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

  3. Leetcode815.公交线路 Bus Routes(Java)

    Leetcode815.公交线路 Bus Routes(Java) ##BFS## 广度优先搜索 2021-03 阿里春招题目 该题应该为图论题,边有权值的情况下寻找最短路径,采用多源BFS解决 示例 ...

  4. 查询中国城市公交线路

    <!--      获取省份城市API接口:http://v.juhe.cn/postcode/pcd?key=e30b66c95726d5f9d7bf4bf9019b5e1f  --> ...

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

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

  6. 基于android公交车线路查询论文文献,本科毕业论文---基于android的手机公交线路查询系统.doc...

    毕 业 设 计( 论 文 ) 题目手机公交线路查询系统作者学院专业学号指导教师 摘 要 关键词: Abstract With the level of people's life improving, ...

  7. 从高德地图获取城市公交线路+站点

    公交线路+站点 在研究城市公共交通问题上,地面的公交网络研究算是很重要的一块,因此获取整个城市的公交线路及其站点的所有数据是非常重要的!但令人高兴的是,有关这些数据的获取其实是很方便快捷的,因为目前的 ...

  8. 课程设计:公交线路管理系统

    #include <iostream> #include <string> #include<iomanip> #include <fstream> u ...

  9. 公交线路管理 数据结构课程设计

    /************************************************* *版权所有 : 张志康 * *文件名称:bus.h,bus.cpp,show.cpp,main.c ...

最新文章

  1. html离开页面时,js实现用户离开页面前提示是否离开此页面的方法(包括浏
  2. [zt]如何用Javascript获得TextArea中的光标位置
  3. java 并发编程视频教程_全面深入学习java并发编程,视频教程下载
  4. 农商银行招聘计算机人员考什么,农商银行招聘考试题都考什么?
  5. arraylist 后往前遍历_ArrayList和LinkedList的深入浅出
  6. java利用poi生成/读取excel表格
  7. python下载pywifi
  8. 魔兽插件是用php吗,GitHub - robinmo/wow_addons_private_use: World Of Warcraft Addons private use 魔兽世界自用插件...
  9. 西湖论剑2021杂项(misc)--YUSA的小秘密
  10. ASCII 字元表(详细讲解)
  11. 亿级(无限级)并发,没那么难
  12. linux下的rtc机制
  13. 图片无序预加载技术一
  14. 统计单词频率 java_java 统计一个(英文)文本中频率最高的10个单词
  15. 「数据集」自动驾驶都有什么测试基准?
  16. Python之路第一课Day2--随堂笔记
  17. 干洗加盟连锁业德国卡柏的SEO案例研讨(转)
  18. 折腾wordpress之路
  19. 接口(服务)之间的调用方式有哪些?/软件系统之间接口的几种通讯方式?
  20. windows系统重装后重新使用之前的oracle

热门文章

  1. struts2配置详解
  2. LinkedHashMap and LinkedHashSet
  3. java中Class.forName与new
  4. Shark Hive Spark Hadoop2 进行整合的测试。
  5. MongoDB 标准连接字符串
  6. 关于java和c的选择结构和循环结构
  7. 一些技术图书编写、推荐、出版人员需要自重
  8. Visual Studio 2008 每日提示(十四)
  9. 使用Notepad++比较文件的差异
  10. php fsockopen解决办法