博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1009 矩阵快速幂+DP+KMP
阅读量:5079 次
发布时间:2019-06-12

本文共 1184 字,大约阅读时间需要 3 分钟。

Problem 1009. -- [HNOI2008]GT考试

1009: [HNOI2008]GT考试

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 3773  Solved: 2314
[][][]

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位的数。 N<=10^9,M<=20,K<=1000

Output

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

Sample Input

4 3 100
111

Sample Output

81
 
 
 
 
先给出递推关系式 dp[i][j]=a0*dp[i-1][0]+a1*dp[i-1][1]+a2*dp[i-1][2]+a3*dp[i-1][3]+.......an*dp[i-1][m-1];
 最终有ans=dp[n][0]+dp[n][1]+dp[n][2]+....dp[n][m-1];
dp[i][j]的意思是前i个数组元素的后缀有j个和所要匹配的字符串相同。
首先说明这个递推关系式是正确的:将所有合法的号码按   字符串的尾缀与不合法字符串的前缀  相同元素的个数分类,满足不重不漏关系,所以DP是对的。
然后关系式为线性关系,所以可以用矩阵快速幂来计算。
剩下的问题就是如何求得a0,a1,a2....an(系数矩阵)。
进行一遍for循环范围为i=0----m-1,可以知道i只能对i+1之前的元素产生影响,然后再进行填数字。再由KMP进行确定系数。
 
 
#include
#include
#include
using namespace std;int n,m,mod;int next[25],num[25];void get(){    int i=0,j=-1;    next[0]=-1;    while(i
>=1;        a=mult(a,a);    }    return r;}int main(){   scanf("%d%d%d",&n,&m,&mod);   getchar();   for(int i=0;i

 

 
 
 

转载于:https://www.cnblogs.com/mfys/p/6898179.html

你可能感兴趣的文章
VC6.0在Win8,10下的兼容性调整
查看>>
2-String to Integer (atoi)
查看>>
iOS 浅赋值、深复制、全然复制的知识点梳理验证(附加归档解档)
查看>>
s:actionmessage页面样式失效
查看>>
android v7包的关联
查看>>
程序员之路
查看>>
websql vs indexdb
查看>>
jsp的常用指令有哪些(编译指令/动作指令整理)
查看>>
Python enumerate遍历数组示例应用
查看>>
学校2016双基竞赛 4/10
查看>>
Linux删除以减号开头的文件
查看>>
mybatis generator如何定制JavaTypeResolver,使smallint类型的数据库字段在po中的类型为Integer?...
查看>>
字节码加载和class实例的顺序问题
查看>>
poj 3122 Pie (高精度+二分)
查看>>
STM32的USART模块CR1的第15位
查看>>
Java中jdk代理和cglib代理
查看>>
程序员学习能力提升三要素
查看>>
Oracle之PL/SQL编程
查看>>
[HDU]4694 Important Sisters(支配树)
查看>>
有向无环图的最小路径覆盖
查看>>