【BZOJ2004】[HNOI2010]Bus 公交线路

题面

bzoj

洛谷

题解

$N$特别大$P,K$特别小,一看就是矩阵快速幂+状压

设$f[S]$表示公交车状态为$S$的方案数

这是什么意思呢?

其实就是表示一个位置是否是公交车最后停靠的位置的状态

剔除无效状态后大约只有$125$左右的状态

直接存矩阵里快速幂转移就好了

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. using namespace std;
  8. #define Mod 30031
  9. #define RG register
  10. int SIZE;
  11. struct Matrix {
  12. int a[135][135];
  13. Matrix() { clear(); }
  14. inline void clear() { memset(a, 0, sizeof(a)); }
  15. void init() { clear(); for (int i = 0; i < SIZE; i++) a[i][i] = 1; }
  16. inline void add(int &x, int y) { x += y; if (x >= Mod) x -= Mod; }
  17. inline int *operator [] (int id) { return a[id]; }
  18. inline Matrix operator * (const Matrix &b) {
  19. Matrix c;
  20. for (RG int i = 0; i < SIZE; i++)
  21. for (RG int j = 0; j < SIZE; j++)
  22. for (RG int k = 0; k < SIZE; k++)
  23. add(c[i][k], a[i][j] * b.a[j][k] % Mod);
  24. return c;
  25. }
  26. } S;
  27. int N, P, K;
  28. int w[1 << 12], v[1 << 12];
  29. Matrix fpow (Matrix x, int y) {
  30. Matrix res; res.init();
  31. while (y) {
  32. if (y & 1) res = res * x;
  33. x = x * x;
  34. y >>= 1;
  35. }
  36. return res;
  37. }
  38. int main () {
  39. scanf("%d%d%d", &N, &K, &P);
  40. for (int i = 1; i < (1 << P); i++) {
  41. int res = 0, x = i;
  42. while (x) ++res, x -= x & (-x);
  43. if (res == K && (i & (1 << P - 1))) w[i] = ++SIZE, v[SIZE] = i;
  44. }
  45. for (int i = 1; i <= SIZE; i++) {
  46. if (v[i] & 1) S[i - 1][w[(1 << P - 1) | (v[i] >> 1)] - 1] = 1;
  47. else {
  48. for (int j = 0; j < P; j++)
  49. if (v[i] & (1 << j))
  50. S[i - 1][w[(1 << P - 1) | ((v[i] ^ (1 << j)) >> 1)] - 1] = 1;
  51. }
  52. }
  53. S = fpow(S, N - K);
  54. int i = w[(1 << P) - (1 << (P - K))];
  55. printf("%d\n", S[i - 1][i - 1]);
  56. return 0;
  57. }

【BZOJ2004】[HNOI2010]Bus 公交线路的更多相关文章

  1. BZOJ2004:[HNOI2010]Bus 公交线路(状压DP,矩阵乘法)

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

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

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

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

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

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

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

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

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

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

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

  7. [bzoj2004] [洛谷P3204] [Hnoi2010] Bus 公交线路

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

  8. bzoj 2004: [Hnoi2010]Bus 公交线路

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

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

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

随机推荐

  1. 微服务框架SpringCloud(Dalston版)学习 (一):Eureka服务注册与发现

    eureka-server eureka服务端,提供服务的注册与发现,类似于zookeeper 新建spring-boot工程,pom依赖: <dependency> <groupI ...

  2. 【[NOI2010]超级钢琴】

    我竟然又在写主席树 现在可是九月啦,我却还在写这种noip不可能考的算法 我觉得我真的要凉 题意很明确,就是给你一个序列,让从中选择\(k\)段连续的序列,长度必须大于等于\(L\)小于等于\(R\) ...

  3. 新闻cms管理系统(一) ---- thinkphp框架准备

    1.thinkphp介绍 一个快速.简单的基于MVC和面向对象的轻量级PHP开发框架 MVC:M数据层. V视图层 . C控制层 优点: (1)入手非常快 (2)thinkpjp提供核心内库.文件.函 ...

  4. Tomcat中的Filter

    Filter 节选部分源码.源码版本 Tomcat8.5 说明 filter 是 Servlet 规范 filter 是在 ,执行 Servlet.service方法之前执行 Filter相关接口 p ...

  5. 关于UWB技术:DecaWave公司的DW1000芯片资料

    关于人在隧道工作时都需要准确的精确度确定精准的位置.DecaWave公司的DW1000芯片,对定位上的精确度更是再适合不过了.符合IEEE802.15.4-2011超宽带标准.按照数据手册上应该最小误 ...

  6. Eclipse常用快捷键(持续更新)

    编辑相关快捷键 Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键. 1.[Ctrl+O] 显示类中方法和属性的大纲, ...

  7. C#简单实现LRU缓存

    最近跟同学吃饭扯淡的时候,由技术扯到薪资,又由薪资扯到他找工作时跟面试官是怎么扯淡拿高工资的,各种技术一顿侃,总之只要啥都了解就没问题了.谈到缓存的时候,我试探性的问了问- -你还记得LRU怎么写吗, ...

  8. stm32 晶振不起振

    1. STM32f103有内部晶振.刚刚上电时,所有Clock都是源于内部晶振,所以当片内没有程序或内部程序没有使能外部晶振时,外部晶振是不会起振的.2. STM32f103有内部复位电路,只有当检测 ...

  9. Web—13-判断网站请求来自手机还是pc浏览器

    判断网站请求来自手机还是pc浏览器 #判断网站来自mobile还是pc def checkMobile(request): """ demo : @app.route(' ...

  10. python 判断是否是润年及函数封装

    方法一, 从终端输入一个表示年份的整数,判断是否是闰年,是就打印xxx年是闰年,不是打印xxx年不是闰年 y = int(input('请输入一个年份:')) if (y % 4 == 0 and y ...