[关闭]
@ZCDHJ 2019-08-06T07:30:55.000000Z 字数 1287 阅读 482

HNOI2010 公交线路

未分类


通过样例可以得知题意中的第 个始发站发第 列车。那么题意可以解读为将 个格子填上 数,最后 个格子需要有所有的数,每个长度为 的子区间都必须包含所有的数。发现 很小,所以设 为前 个格子已经填完,后 个格子的是否填涂的二进制状态。为了满足题目的限制,强制 的二进制第一位是 ,总共有 个一。那么 能从 转移过来的条件就是 去掉第一位后面补上一个零后只与 有一个二进制位不一样( 是零 是一)。然后矩阵快速幂就完事了。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. const int MOD = 30031;
  5. int n, K, P, cnt;
  6. int S[256];
  7. struct Matrix {
  8. int a[127][127];
  9. Matrix() {
  10. memset(a, 0, sizeof(a));
  11. }
  12. friend Matrix operator* (const Matrix &lhs, const Matrix &rhs) {
  13. Matrix res;
  14. for (int i = 1; i <= 126; ++i) {
  15. for (int j = 1; j <= 126; ++j) {
  16. for (int k = 1; k <= 126; ++k) {
  17. res.a[i][j] = (res.a[i][j] + (lhs.a[i][k] * rhs.a[k][j]) % MOD) % MOD;
  18. }
  19. }
  20. }
  21. return res;
  22. }
  23. } dp, d, ans;
  24. inline int read() {
  25. register int x = 0;
  26. register char ch = getchar();
  27. while (!isdigit(ch)) ch = getchar();
  28. while (isdigit(ch)) {
  29. x = x * 10 + ch - '0';
  30. ch = getchar();
  31. }
  32. return x;
  33. }
  34. Matrix quickPow(Matrix x, int y) {
  35. Matrix res = x, base = x;
  36. --y;
  37. while (y > 0) {
  38. if (y & 1) res = res * base;
  39. base = base * base;
  40. y >>= 1;
  41. }
  42. return res;
  43. }
  44. int main() {
  45. n = read();
  46. K = read();
  47. P = read();
  48. int ansPos = 0;
  49. for (int i = 1 << (P - 1); i < 1 << P; ++i) {
  50. int tmp = i, sum = 0;
  51. while (tmp > 0) sum += (tmp & 1), tmp >>= 1;
  52. if (sum == K) S[++cnt] = i;
  53. if (i == ((1 << K) - 1) << (P - K)) dp.a[1][cnt] = 1, ansPos = cnt;
  54. }
  55. for (int i = 1; i <= cnt; ++i) {
  56. for (int j = 1; j <= cnt; ++j) {
  57. int tmp = S[i] ^ (1 << (P - 1)), sum = 0;
  58. tmp = (tmp << 1) ^ S[j];
  59. while (tmp > 0) sum += (tmp & 1), tmp >>= 1;
  60. if (sum == 1) {
  61. d.a[i][j] = 1;
  62. }
  63. }
  64. }
  65. dp = dp * quickPow(d, n - K);
  66. printf("%d\n", dp.a[1][ansPos]);
  67. return 0;
  68. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注