Description

阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字。他的不吉利数学 A1A2...Am(0<=Ai<=9)有M位,不出现是指X1X2...Xn中没有恰好一段等于A1A2...Am. A1和X1可以为0

Input

第一行输入N,M,K.接下来一行输入M位的数。 100%数据N<=10^9,M<=20,K<=1000 40%数据N<=1000 10%数据N<=6

Output

阿申想知道不出现不吉利数字的号码有多少种,输出模K取余的结果.

Sample Input

4 3 100
111

Sample Output

81

分析

“——然而谁也看不穿HNOI……”= =谁知道hnoi2008连出两道矩阵快速幂是什么心态呢……

这里可以先用kmp之类的字符串算法预处理出“不吉利串”中的所有前缀之间的转移边,构造一个N*N的矩阵,其中A(i,j)表示由不吉利串的i前缀转移到j前缀的方法数。注意矩阵的坐标范围为0~N-1,即这一矩阵是在所有非匹配状态之间进行的转移,因此最终转移出的所有状态都满足提议。所以我们最后做一个矩阵快速幂,右边乘上N位的全1列向量,结果取第0行即可。

  1 /**************************************************************
  2     Problem: 1009
  3     User: AsmDef
  4     Language: C++
  5     Result: Accepted
  6     Time:56 ms
  7     Memory:812 kb
  8 ****************************************************************/
  9  
 10 #include <cctype>
 11 #include <cstdio>
 12 using namespace std;
 13 template<typename T>inline void getd(T &x){
 14     char c = getchar(); bool minus = 0;
 15     while(!isdigit(c) && c != '-')c = getchar();
 16     if(c == '-')minus = 1, c = getchar();
 17     x = c - '0';
 18     while(isdigit(c = getchar()))x = x * 10 + c - '0';
 19     if(minus)x = -x;
 20 }
 21 /*========================================================*/
 22 const int maxm = 23;
 23 int N, M, K, p[maxm][maxm], tmp[maxm][maxm];
 24 char St[maxm];
 25 inline int bitcnt(int x){
 26     x = ((x >> 1) & 0x55555555) + (x & 0x55555555);
 27     x = ((x >> 2) & 0x33333333) + (x & 0x33333333);
 28     x = ((x >> 4) & 0x0f0f0f0f) + (x & 0x0f0f0f0f);
 29     x = ((x >> 8) & 0x00ff00ff) + (x & 0x00ff00ff);
 30     x = ((x >> 16) & 0x0000ffff) + (x & 0x0000ffff);
 31     return x;
 32 }
 33 struct Mat{
 34     int A[maxm][maxm];
 35     void operator *= (const Mat &x){
 36         int i, j, k;
 37         for(i = 0;i < M;++i)for(j = 0;j < M;++j){
 38             tmp[i][j] = 0;
 39             for(k = 0;k < M;++k)
 40                 tmp[i][j] = (tmp[i][j] + A[i][k] * x.A[k][j]) % K;
 41         }
 42         for(i = 0;i < M;++i)for(j = 0;j < M;++j)
 43             A[i][j] = tmp[i][j];
 44     }
 45 }Ans, Per;
 46 inline void init(){
 47     getd(N), getd(M), getd(K);
 48     int i, j, k, t, next[maxm];
 49     while(!isdigit(St[1] = getchar())); St[1] -= '0';
 50     for(i = 2;i <= M;++i)
 51         St[i] = getchar() - '0';
 52     next[0] = next[1] = 0;
 53     for(i = 1;i < M;++i){
 54         j = next[i]; k = (1 << 10) - 1;
 55         p[i][i+1] = 1; k ^= (1 << St[i+1]);
 56         while(j && St[j+1] != St[i+1]){
 57             t = 1 << St[j+1];
 58             if(k & t)p[i][j+1] = 1, k ^= t;
 59             j = next[j];
 60         }
 61         if(St[j+1] != St[i+1]){
 62             next[i+1] = 0;
 63             t = 1 << St[1];
 64             if(k & t)p[i][1] = 1, k ^= t;
 65         }
 66         else{
 67             next[i+1] = j+1;
 68             while(j){
 69                 j = next[j];
 70                 if(St[j+1] != St[i+1]){
 71                     t = 1 << St[j+1];
 72                     if(k & t)p[i][j+1] = 1, k ^= t;
 73                 }
 74             }
 75         }
 76         p[i][0] = bitcnt(k);
 77     }
 78     p[0][0] = 9, p[0][1] = 1;
 79     for(i = 0;i < M;++i)for(j = 0;j < M;++j)
 80         Ans.A[i][j] = Per.A[i][j] = p[i][j];
 81 }
 82  
 83 int main(){
 84     #if defined DEBUG
 85     freopen("test", "r", stdin);
 86     #else
 87     //freopen("bzoj_1009.in", "r", stdin);
 88     //freopen("bzoj_1009.out", "w", stdout);
 89     #endif
 90     init();
 91     if(!N){printf("0\n");return 0;}
 92     N -= 1;
 93     while(N){
 94         if(N & 1)Ans *= Per;
 95         Per *= Per;
 96         N >>= 1;
 97     }
 98     **tmp = 0;
 99     while(M--)
100         **tmp = (**tmp + Ans.A[0][M]) % K;
101     printf("%d\n", **tmp);
102      
103     return 0;
104 }

kmp+矩阵快速幂

转载于:https://www.cnblogs.com/Asm-Definer/p/4368201.html

[bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)相关推荐

  1. Log Concave Sequences(矩阵快速幂求递推)

    Log Concave Sequences Gym - 102302H A sequence of numbers A is said to be logarithm concave if, and ...

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

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

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

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

  4. 矩阵快速幂 学习笔记

    据说,矩阵快速幂在递推式优化上相当神奇,而且效率很高... 两矩阵相乘,朴素算法的复杂度是O(N^3).如果求一次矩阵的M次幂,按朴素的写法就是O(N^3*M).既然是求幂,不免想到快速幂取模的算法, ...

  5. 2012 Tokyo Regional C. One-Dimensional Cellular Automaton 矩阵快速幂

    题意:一个二元函数S(i, t)满足下列方程: 给出,其中N为i的个数,需要求出的值 思路:矩阵快速幂,递推式如下: #include<bits/stdc++.h> using names ...

  6. Queuing(矩阵快速幂)

    Queuing Queues and Priority Queues are data structures which are known to most computer scientists. ...

  7. P1357 花园 (矩阵快速幂+ DP)

    题意:一个只含字母C和P的环形串 求长度为n且每m个连续字符不含有超过k个C的方案数 m <= 5  n <= 1e15 题解:用一个m位二进制表示状态 转移很好想 但是这个题是用矩阵快速 ...

  8. BZOJ 2004 公交线路(状压DP+矩阵快速幂)

    注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...

  9. HDU 2256(矩阵快速幂)

    传送门 题面: Problem of Precision Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

最新文章

  1. 乐鑫wifi模块二次开发_米家部分智能硬件拆解,ZigBee/WIFI模块分析及二次开发
  2. SFB 项目经验-57-Skype for business-录音系统-你拥有吗(模拟线路)
  3. OCP大会 | T-Flex 2.0服务器框架介绍(附PDF)
  4. python处理一亿条数据_Python基础数据处理库
  5. 解决LInux更新慢的问题, 更换国内软件源
  6. 【Verilog】verilog实现奇数次分频
  7. python怎样定义font_无法在matplotlib中使用自定义字体
  8. Fxfactory插件:复古电影调色插件Sheffield Softworks Vintage
  9. 路由巧设置 局域网轻松限制BT下载
  10. 代码管理平台—svn
  11. c语言fl,用C语言操作SPMC75内部FLSASH
  12. window修改host文件
  13. Discuz3.4-SSRF-从触发点到构造payload
  14. 响应式图像--图片自适应大小
  15. 会聊天、提醒、撩妹的Python微信机器人你肯定没见过
  16. 单缝斜入射衍射_傅里叶变换解夫琅禾费衍射问题的几个例子_2
  17. Java: static,final,代码块 的详解
  18. 2018年Android SDK下载安装及配置教程
  19. linux tcpreplay命令
  20. 格物致知iOS系列之类与对象

热门文章

  1. UVA 10004 Bicoloring
  2. 一些iphone开发的资料
  3. 公差基本偏差代号_508/f7:基本偏差怎么查,标准公差又怎么查?
  4. java guava 使用_使用Guava操作基本类型
  5. 有关python的知识点_Python常见的知识点整理
  6. u盘弹出工具_双佳数码 | 电脑u盘无法弹出怎么办?
  7. 永济计算机培训,永济云计算培训,永济计算机培训学费,永济计算机学完工作好找吗 - IT教育频道...
  8. PostgreSQL 12系统表(11)pg_user
  9. Python机器学习:KNN算法08更多思考
  10. 数据科学入门与实战:玩转pandas实战项目分析航班晚点情况