LOJ#3098. 「SNOI2019」纸牌

显然选三个以上的连续牌可以把他们拆分成三个三张相等的

于是可以压\((j,k)\)为有\(j\)个连续两个的,有\(k\)个连续一个的

如果当前有\(i\)张牌,且\(i >= j + k\)

那么可以\((j,k)\rightarrow (k,(i - j - k) \% 3)\)

可以用矩阵乘法优化,每遇到一个有下限的牌面的就再特殊造一个矩阵转移

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define space putchar(' ')
  8. #define enter putchar('\n')
  9. #define eps 1e-10
  10. #define ba 47
  11. #define MAXN 5005
  12. //#define ivorysi
  13. using namespace std;
  14. typedef long long int64;
  15. typedef unsigned int u32;
  16. typedef double db;
  17. template<class T>
  18. void read(T &res) {
  19. res = 0;T f = 1;char c = getchar();
  20. while(c < '0' || c > '9') {
  21. if(c == '-') f = -1;
  22. c = getchar();
  23. }
  24. while(c >= '0' && c <= '9') {
  25. res = res * 10 +c - '0';
  26. c = getchar();
  27. }
  28. res *= f;
  29. }
  30. template<class T>
  31. void out(T x) {
  32. if(x < 0) {x = -x;putchar('-');}
  33. if(x >= 10) {
  34. out(x / 10);
  35. }
  36. putchar('0' + x % 10);
  37. }
  38. const int MOD = 998244353;
  39. int inc(int a,int b) {
  40. return a + b >= MOD ? a + b - MOD : a + b;
  41. }
  42. int mul(int a,int b) {
  43. return 1LL * a * b % MOD;
  44. }
  45. void update(int &x,int y) {
  46. x = inc(x,y);
  47. }
  48. int getid(int x,int y) {
  49. return x * 3 + y;
  50. }
  51. struct Matrix {
  52. int f[9][9];
  53. Matrix() {memset(f,0,sizeof(f));}
  54. friend Matrix operator * (const Matrix &a,const Matrix &b) {
  55. Matrix c;
  56. for(int k = 0 ; k < 9 ; ++k) {
  57. for(int i = 0 ; i < 9 ; ++i) {
  58. for(int j = 0 ; j < 9 ; ++j) {
  59. update(c.f[i][j],mul(a.f[i][k],b.f[k][j]));
  60. }
  61. }
  62. }
  63. return c;
  64. }
  65. friend Matrix fpow(Matrix a,int64 c) {
  66. Matrix res,t = a;
  67. for(int i = 0 ; i < 9 ; ++i) res.f[i][i] = 1;
  68. while(c) {
  69. if(c & 1) res = res * t;
  70. t = t * t;
  71. c >>= 1;
  72. }
  73. return res;
  74. }
  75. }a,ans,b;
  76. int64 n;
  77. int C,X;
  78. void Solve() {
  79. read(n);read(C);
  80. for(int i = 0 ; i <= C ; ++i) {
  81. for(int j = 0 ; j < 3 ; ++j) {
  82. for(int k = 0 ; k < 3 ; ++k) {
  83. if(i < j + k) continue;
  84. update(a.f[getid(j,k)][getid(k,(i - j - k) % 3)],1);
  85. }
  86. }
  87. }
  88. for(int i = 0 ; i < 9 ; ++i) ans.f[i][i] = 1;
  89. read(X);
  90. int64 k;int t;
  91. int64 p = 0;
  92. for(int i = 1 ; i <= X ; ++i) {
  93. read(k);read(t);
  94. ans = ans * fpow(a,k - 1 - p);
  95. memset(b.f,0,sizeof(b.f));
  96. for(int h = t ; h <= C ; ++h) {
  97. for(int j = 0 ; j < 3 ; ++j) {
  98. for(int k = 0 ; k < 3 ; ++k) {
  99. if(h < j + k) continue;
  100. update(b.f[getid(j,k)][getid(k,(h - j - k) % 3)],1);
  101. }
  102. }
  103. }
  104. ans = ans * b;
  105. p = k;
  106. }
  107. if(p < n) ans = ans * fpow(a,n - p);
  108. out(ans.f[0][0]);enter;
  109. }
  110. int main(){
  111. #ifdef ivorysi
  112. freopen("f1.in","r",stdin);
  113. #endif
  114. Solve();
  115. }

【LOJ】#3098. 「SNOI2019」纸牌的更多相关文章

  1. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  2. 【LOJ】#3097. 「SNOI2019」通信

    LOJ#3097. 「SNOI2019」通信 费用流,有点玄妙 显然按照最小路径覆盖那题的建图思路,把一个点拆成两种点,一种是从这个点出去,标成\(x_{i}\),一种是输入到这个点,使得两条路径合成 ...

  3. 【LOJ】#3096. 「SNOI2019」数论

    LOJ#3096. 「SNOI2019」数论 如果\(P > Q\)我们把\(P\)和\(Q\)换一下,现在默认\(P < Q\) 这个时候每个合法的\(a_i\)都可以直接落到\(Q\) ...

  4. 【LOJ】#3095. 「SNOI2019」字符串

    LOJ#3095. 「SNOI2019」字符串 如果两个串\(i,j\)比较\(i < j\),如果离\(a_{i}\)最近的不同的数是\(a_{k}\),如果\(j < k\)那么\(i ...

  5. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  6. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  7. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  8. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  9. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

随机推荐

  1. Codevs 1768 种树 3(差分约束)

    1768 种树 3 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 为了绿化乡村,H村积极响应号召,开始种树了. H村里有n幢 ...

  2. CF917D Stranger Trees【矩阵树定理,高斯消元】

    题目链接:洛谷 题目大意:给定一个$n$个节点的树$T$,令$ans_k=\sum_{T'}[|T\cap T'|=k]$,即有$k$条边重合.输出$ans_0,ans_1,\ldots,ans_{n ...

  3. 第十七节:Runnable创建线程,Thread创建线程,唤醒线程和计数器多线程,线程同步与等待

    Runnable创建线程 public class RunnableDemo implements Runnable{ @Override public void run(){ int i = 1; ...

  4. c++ 容器切片反转次序(不拷贝到新容器)

    // rotate algorithm example #include <iostream> // cout #include <algorithm> // rotate # ...

  5. Mysql备份恢复方案解析

    1.全量备份和增量备份 1.1全量备份 就是对现有的数据进行全部备份,之前做的备份均可舍弃,以最新的全备为基点. a.全备所有数据库 Innodb引擎: [root@leader mysql]#mys ...

  6. postgre-插入数据时的单引号问题

    场景: 将一个HTML页面存储到数据库中 问题: HTML页面中既包含单引号也包含双引号 解决办法: 双单引号 INSERT INTO table VALUES ('<html><s ...

  7. python网络爬虫(一):网络爬虫的定义

    网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个页面(通常是首页)开 ...

  8. elasticsearch中文分词器(ik)配置

    elasticsearch默认的分词:http://localhost:9200/userinfo/_analyze?analyzer=standard&pretty=true&tex ...

  9. mysql—并发控制及事务

    并发控制 实现的并发访问的控制技术是基于锁: 锁分为表级锁和行级锁,MyISAM存储引擎不支持行级锁:InnoDB支持表级锁和行级锁: 锁的分类有读锁和写锁,读锁也被称为共享锁,加读锁的时候其他的人可 ...

  10. 黑马vue---28、vue中全局过滤器的基本使用

    黑马vue---28.vue中全局过滤器的基本使用 一.总结 一句话总结: vue中的过滤器可以传递参数(根据参数来过滤),也可以用管道符拼接多个过滤器:例如<p>{{ msg | msg ...