题意

有一个长度为\(n\)\((n\le1e^9)\)只由阿拉伯数字组成的串\(A\),现在给一个长度为\(m\)\((m\le20)\)同样只由阿拉伯数字组成的串\(B\),求满足条件的\(A\)串个数,条件:\(B\)串不包含在\(A\)串。

题解

\(dp[i][j]=\)长度为\(i\)且末尾(后缀)已经与\(B\)串首部(前缀)匹配了\(j\)位的满足条件的串的方案数。则:\[dp[i][j] = \sum_{k = 0}^{m - 1}dp[i - 1][k]*a[k][j]\] \(a[k][j]=\) 已经匹配了\(k\)位现在再加一个数字而能匹配\(j\)位的方案数。比如\(B\)串为\(12315\),\(a[1][1] = 1\)就是\(1 + ?\)能与\(12315\)匹配\(1\)位的方案数是1的\(?\)的取值个数(\(? = 1\))。这里讲的匹配是指\(1?\)的后缀与\(12315\)的前缀相同的串的长度。\[a = \begin{pmatrix} 9 & 1 & 0 & 0 & 0 & 0 \\ 8 & 1 & 1 & 0 & 0 & 0 \\ 8 & 1 & 0 & 1 & 0 & 0 \\ 9 & 0 & 0 & 0 & 1 & 0 \\ 7 & 1 & 1 & 0 & 0 & 1 \end{pmatrix}\]行代表\(k\),列代表\(j\)。如何求出\(a\)数组?既然是在求公共的前缀和后缀,故联想到\(KMP\)的\(Next\)数组。具体做法见代码。观察上面的转移方程,系数都是常数且是一次方程,自然而然的转化为矩阵的乘积形式,以\(m\) = 5,\(B\)串为:12315为例\[\begin{pmatrix} dp[i][0] & \dots & dp[i][m - 1] \end{pmatrix}= \begin{pmatrix} dp[i - 1][0] & \dots & dp[i - 1][m - 1] \end{pmatrix}* \begin{pmatrix} 9 & 1 & 0 & 0 & 0 \\ 8 & 1 & 1 & 0 & 0 \\ 8 & 1 & 0 & 1 & 0 \\ 9 & 0 & 0 & 0 & 1 \\ 7 & 1 & 1 & 0 & 0 \end{pmatrix}\]因为是求不包含\(B\)串的A串个数,故\(a\)矩阵的最后一列应该忽略。

const int N = 100005;int mod;struct mat {int t;int A[22][22];mat() {mem(A, 0);}void Inite(int m) {t = m;}mat operator * (const mat& tp) {mat ans;ans.t = tp.t;rep(i, 0, t) rep(j, 0, t) rep(k, 0, t) {ans.A[i][j] += A[i][k] * tp.A[k][j];ans.A[i][j] %= mod;}return ans;}void operator = (const mat& tp) {t = tp.t;rep(i, 0, t) rep(j, 0, t) A[i][j] = tp.A[i][j];}
};int n, m;
int nxt[22];string s;mat qpow(mat C, int x) {mat B;B.Inite(m);rep(i, 0, m) B.A[i][i] = 1;for (; x; C = C * C, x >>= 1) if (x & 1) B = B * C;return B;
}void Next(){nxt[0] = nxt[1] = 0;rep(i, 1, m) {int k = nxt[i];while(k && s[k] != s[i]) k = nxt[k];nxt[i + 1] = (s[k] == s[i] ? k + 1 : 0);}
}int main()
{cin >> n >> m >> mod >> s;Next();mat B;B.Inite(m);rep(i, 0, m) for (char j = '0'; j <= '9'; ++j) {int k = i;while(k && s[k] != j) k = nxt[k];if (s[k] == j) k++;if (k != m) B.A[i][k]++;}mat C = qpow(B, n);mat D;D.Inite(m);D.A[0][0] = 1;C = D * C;int ans = 0;rep(i, 0, m) ans = (ans + C.A[0][i]) % mod;cout << ans << endl;return 0;
}


转载于:https://www.cnblogs.com/zgglj-com/p/9729284.html

[HNOI2008]GT考试相关推荐

  1. BZOJ 1009 [HNOI2008]GT考试

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2154  Solved: 1327 [Submit][Sta ...

  2. BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 ...

  3. bzoj 1009: [HNOI2008]GT考试(dp+kmp+矩阵快速幂)

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 3932  Solved: 2398 [Submit][Sta ...

  4. [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)

    Description 阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学 A1A2...Am(0&l ...

  5. [HNOI2008]GT考试[矩阵快速幂+kmp优化的dp]

    解题思路:假如说我们用f[i]表示长度为i的串能组合成无不吉利数字的组合的个数的话我们无法找到f[i]和f[i+1]的关系,就是我们下一位填某个数字会不会出现不吉利串,这就和你前面的串末尾于不吉利串重 ...

  6. [HNOI2008 GT考试]

    [关键字]:动态规划 矩阵乘法 [题目大意]:给定一个字符集为(0-9)的字符串T(length<=20),求长度为N的不包含T的字符串的总数. //====================== ...

  7. BZOJ 1009:[HNOI2008]GT考试

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1009 大意:给一个长度不大于20的数字串,求长度为N(10^9)的所有数字串中不包含该串 ...

  8. BZOJ 1009: [HNOI2008]GT考试(kmp+dp+矩阵优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 思路: 真的是好题啊! 对于这种题目,很有可能就是dp,$f[i][j]$表示分析到第 ...

  9. BZOJ[1009] [HNOI2008]GT考试

    了了已久的心结 f[i][j]表示到第i为,长度为j的后缀与不吉利数字的前缀相同,其实这个和一些期望概率的DP类似,利用a数组记录当前j在加上不同的数字之后,可以分别转移至那些状态,用KMP处理一下, ...

最新文章

  1. 基于Transformers入门自然语言处理!
  2. poj3508(高精度模拟减法)
  3. atm c语言流程图_c语言ATM机程序
  4. 监控录像帮忙找回医院被偷的女婴
  5. js ==与=== 的区别
  6. 第二周 数据分析之展示 Matplotlib库入门
  7. 低功耗蓝牙onscanresult 出来名字为空_浅析BLE5.0蓝牙模块在智能家居的运用
  8. Nginx 502 Bad Gateway 错误的原因及解决方法
  9. Kubernetes 真的很复杂吗?
  10. IntelliJ IDEA的安装详解
  11. linux c++ 函数效率,Linux C++程序进行性能分析工具gprof使用入门
  12. [分组背包]Luogu1064 金明的预算方案
  13. Oracle中文简繁体转换函数
  14. arduino控制雨滴传感器
  15. 2500个常用汉字列表
  16. 从辉煌走向消亡(下)——小型机之王DEC公司
  17. Java中swing修改左上角的图标
  18. 计算机管理员改时间,电脑时间修改权限
  19. 1.5 密码学应用PKI体系
  20. git gui :Updating the Git index failed. A rescan will be automatically started to res

热门文章

  1. 在家办公这些天整理的Kafka知识点大全
  2. 提炼SLG的“决策观”,《三国志14》做了哪些“加减法”
  3. 王者荣耀10连胜,竟然也有人不相信,猎游大神带菜鸡玩家10连胜
  4. 阿里云——ECS——Linux服务器购买流程——超级细致
  5. PHP面试题:PHP.ini路径?
  6. Linux系统中病毒怎么解决
  7. 常见Java面试题 在Queue中poll()和remove()有什么区别?
  8. The requested URL /nagios/cgi-bin/statusmap.cgi was not found on this server
  9. AIX系统CPU监控与评估
  10. 配置两个不同kerberos认证中心的集群间的互信