Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 2486  Solved: 1524
[Submit][Status][Discuss]

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
 
题解:
  首先想暴力的算法,假设构造出一个字符串来和A串进行匹配,f[i][j]代表前i个位置的数中后缀有j位是匹配的,当前要在第i+1个位置新加入一个数字k,看此时对f[i+1][x]的贡献,来更新f[i+1][x]。
①:如果k==A[j+1],则f[i+1][j+1]+=f[i][j]   
②:如果不相等,让 j 根据对于A串构造出的next[]进行跳转,直到跳转后的j使得A[j+1]==k,即f[i+1][tmp+1]=f[i+1][tmp+1]+f[i][j]
③:如果以上两种情况都不满足的话,就看看k是不是和A[1]相等,如果相等:f[i+1][1]=f[i+1][1]+f[i][j]
④:实在没法匹配,就只能f[i+1][0]=f[i+1][0]+f[i][j]
最后:for(LL j=0;j<=M-1;j++) ans+=(f[N][j])%mod,ans%=mod; 得出是就是答案。
  40分暴力:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 LL N,M,K;
 5 LL f[2000][30],next[30],lenA,A[30],ans,mod;
 6 char s[30];
 7 int main(){
 8     scanf("%lld%lld%lld%s",&N,&M,&K,s+1); lenA=strlen(s+1); mod=K;
 9     for(LL i=1;i<=lenA;i++) A[i]=s[i]-'0';
10     for(LL j=0,i=2;i<=lenA;i++){
11         while(A[j+1]!=A[i]&&j) j=next[j];
12         if(A[j+1]==A[i]) j++;
13         next[i]=j;
14     }
15     f[1][0]=9; f[1][1]=1;
16     for(LL i=1;i<=N-1;i++){//前 i个字符
17         for(LL j=0;j<=min(M-1,i);j++){//末尾有j位匹配
18             for(LL k=0;k<=9;k++){//再加入数字 k
19                 LL tmp=j; bool vis=false;
20                 if(A[tmp+1]==k){
21                 f[i+1][j+1]=(f[i+1][j+1]+f[i][j]%mod)%mod;
22                     vis=true;
23                     continue;
24                 }
25                 else{
26                     while(next[tmp]!=0){
27                         tmp=next[tmp];
28                         if(A[tmp+1]==k){
29                             f[i+1][tmp+1]=(f[i+1][tmp+1]+f[i][j]%mod)%mod;
30                             vis=true;
31                             break;
32                         }
33                     }
34                 }
35                 if(vis==false){
36                     if(A[1]==k) f[i+1][1]=(f[i+1][1]+f[i][j]%mod)%mod;
37                     else f[i+1][0]=(f[i+1][0]+f[i][j]%mod)%mod;
38                 }
39             }
40         }
41     }
42     for(LL j=0;j<=M-1;j++)
43         ans+=(f[N][j])%mod,ans%=mod;
44     printf("%lld",ans);
45     return 0;
46 }

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,mod,ans;
 4 char str[25];
 5 int next[25],s[25],a[25][25],c[25][25],f[25],d[25];
 6 int idx(char ch){
 7     return ch-'0';
 8 }
 9 void KMP(){
10     for(int i=0;i<m;i++) s[i+1]=idx(str[i]);
11     for(int j=0,i=2;i<=m;i++){
12         while(j&&s[j+1]!=s[i]) j=next[j];
13         if(s[j+1]==s[i])++j;
14         next[i]=j;
15     }
16 }
17 void Makematrix(){//a[i][k]表示由匹配 i个到匹配 k个的方案数
18     for(int i=0;i<=m-1;i++){
19         for(int j=0;j<=9;j++){
20             int k=i;
21             while(j!=s[k+1]&&k) k=next[k];
22             if(s[k+1]==j) k++;
23             a[i][k]++;
24         }
25     }
26 }
27 void muti1(){
28     memset(d,0,sizeof(d));
29     for(int i=0;i<m;i++)
30         for(int j=0;j<m;j++)
31             d[i]=(d[i]+f[j]*a[j][i])%mod;
32     for(int i=0;i<m;i++) f[i]=d[i];
33 }
34 void muti2(){
35     memset(c,0,sizeof(c));
36     for(int i=0;i<m;i++)
37         for(int j=0;j<m;j++)
38             for(int k=0;k<m;k++)
39                 c[i][j]=(c[i][j]+a[i][k]*a[k][j])%mod;
40     for(int i=0;i<m;i++)
41         for(int j=0;j<m;j++)a[i][j]=c[i][j];
42 }
43 int main(){
44 //    freopen("bzoj_1009.in","r",stdin);
45 //    freopen("bzoj_1009.out","w",stdout);
46     scanf("%d%d%d",&n,&m,&mod);
47     cin>>str;
48     KMP(); Makematrix();
49     f[0]=1;
50     while(n){
51         if(n&1) muti1();
52         muti2(); n>>=1;
53     }
54     for(int i=0;i<m;i++)
55         ans+=f[i];
56     printf("%d\n",ans%mod);
57 }

转载于:https://www.cnblogs.com/CXCXCXC/p/5168257.html

bzoj 1009: [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考试(dp+kmp+矩阵快速幂)

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

  3. BZOJ 1009:[HNOI2008]GT考试

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

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

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

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

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

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

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

  7. BZOJ 1005: [HNOI2008]明明的烦恼

    BZOJ 1005: [HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线 ...

  8. GT考试(bzoj 1009)

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

  9. BZOJ 1009 GT考试 (AC自动机 + 矩阵乘法加速dp)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 准考证号为\(n\)位数\(X_1X_2....X_n(0<=X_ ...

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

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

最新文章

  1. 关于asp.net Session丢失问题的总结
  2. 地形纹理Splatting技术(翻译)
  3. 云白条,做有温度的金融,帮助有困难的人
  4. 牛客网(剑指offer) 第十一题 二进制中1的个数
  5. python下载包管理器_Python包管理整理:setuptool管理python相关的包
  6. 鲍捷 | 知识图谱从 0 级到 10 级简化版
  7. 重磅发布 | 阿里云视图计算,边缘计算的主“战”场
  8. ssg国际数字货币商城源码货币商城+数字货币+双端APP
  9. 图片查看器 bmp jpg png 动态gif office 2007风格
  10. sqlite C/C++
  11. 系统调用表与系统调用号-=>数组与下标
  12. Java多线程为什么使用while循环来调用wait方法
  13. Shell中的grep、awk和sed的常用命令和语法
  14. war压缩命令_ubuntu/linux下打包压缩war、解压war包和jar命令
  15. 下载安装最新kali虚拟机及切换中文方法
  16. html 小喇叭图标,小喇叭不见了怎么办(小喇叭图标不见了的原因及解决办法)...
  17. 美金融犯罪执法局文件遭泄露:汇丰、摩根大通、渣打等国际大行涉嫌非法转移资金...
  18. 背阔肌(05):史密斯机俯身划船
  19. python能代替ps吗_Python中怎么像PS一样处理图像
  20. 计算机桌面复制到画图,Windows10系统下将画图小工具添加到桌面的技巧

热门文章

  1. New features in EJB3.1 (Part 4)
  2. SecureCRT 登录跳板机自动连接目标服务器
  3. Spark算子:RDD行动Action操作(2)–take、top、takeOrdered
  4. 面试官:谈谈分布式一致性机制,我一脸懵逼。。
  5. 注意了!System.currentTimeMillis() 存在性能问题...
  6. 【系统架构】如何逐步去构建一个大型网站系统
  7. 300本计算机编程的经典书籍下载
  8. 浪潮工程师窃取公司CPU、硬盘在咸鱼挂卖被阿里发现,判处有期徒刑3年3个月...
  9. mysql 单精度和双经度,mysql – 计算距离给定2点,纬度和经度
  10. 工作几年只会增删改查怎么了,大神们都是从第一行代码开始的!