传送门

f[i][j]f[i][j]f[i][j]表示从状态“匹配了前i位”转移到“匹配了前j位”的方案数。

这个东西单次是可以通过跳kmp的fail数组得到的。

考虑到每次都是一样的就可以用矩阵快速幂优化一波。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,mod,fail[21];
bool vis[21][10];
char s[21];
struct Matrix{
	int val[21][21];
	Matrix(int x=0){
		memset(val,0,sizeof(val));
		for(int i=0;i<m;++i)val[i][i]=x;
	}
	inline Matrix operator*(const Matrix&b){
		Matrix ret(0);
		for(int i=0;i<m;++i)for(int k=0;k<m;++k)for(int j=0;j<m;++j)(ret.val[i][j]+=val[i][k]*b.val[k][j]%mod)%=mod;
		return ret;
	}
	friend inline Matrix operator^(Matrix a,int p){Matrix ret(1);for(;p;p>>=1,a=a*a)if(p&1)ret=ret*a;return ret;}
}ans,a;
int main(){
	scanf("%d%d%d%s",&n,&m,&mod,s+1);
	ans.val[0][0]=1;
	for(int i=0;i<m;++i)a.val[i][0]=9;
	for(int i=0;i<m-1;++i)a.val[i][i+1]=1;
	for(int i=2,j=0;i<=m;++i){
		while(s[i]!=s[j+1]&&j)j=fail[j];
		if(s[i]==s[j+1])++j;
		fail[i]=j;
	}
	for(int i=1;i<m;++i){
		int j=i;
		do{
			j=fail[j];
			if(s[i+1]!=s[j+1]&&!vis[i][s[j+1]-'0']){
				vis[i][s[j+1]-'0']=1;
				++a.val[i][j+1];
				--a.val[i][0];
			}
		}while(j);
	}
	ans=ans*(a^n);
	int ret=0;
	for(int i=0;i<m;++i)(ret+=ans.val[0][i])%=mod;
	cout<<ret;
	return 0;
}

2018.10.22 bzoj1009: [HNOI2008]GT考试(kmp+矩阵快速幂优化dp)的更多相关文章

  1. bzoj1009 [HNOI2008]GT考试——KMP+矩阵快速幂优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串计数DP问题啊...连题解都看了好多好久才明白,别提自己想出来的蒟蒻我... 首 ...

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

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

  3. 【bzoj1009】[HNOI2008]GT考试(矩阵快速幂优化dp+kmp)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 这道题一看数据范围:$ n<=10^9 $,显然不是数学题就是矩乘快速幂优 ...

  4. BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4266  Solved: 2616[Submit][Statu ...

  5. 2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)

    传送门 首先按照题意构造出转移矩阵. 然后可以矩阵快速幂求出答案. 但是直接做是O(n3qlogm)O(n^3qlogm)O(n3qlogm)的会TTT掉. 观察要求的东西发现我们只关系一行的答案. ...

  6. 2018.10.16 uoj#340. 【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂优化dp)

    传送门 一道不错的矩阵快速幂优化dpdpdp. 设f[i][j][k][l]f[i][j][k][l]f[i][j][k][l]表示前iii轮第iii轮还有jjj个一滴血的,kkk个两滴血的,lll个 ...

  7. [HNOI2008][bzoj1009] GT考试 [KMP+矩阵快速幂]

    题面 传送门 思路 首先,如果$n$和$m$没有那么大的话,有一个非常显然的dp做法: 设$dp[i][j]$表示长度为i的字符串,最后j个可以匹配模板串前j位的情况数 那么显然,答案就是$\sum_ ...

  8. BZOJ 1009 [HNOI2008]GT考试(矩阵快速幂优化DP+KMP)

    题意: 求长度为n的不含长为m的指定子串的字符串的个数 1s, n<=1e9, m<=50 思路: 长见识了.. 设那个指定子串为s f[i][j]表示长度为i的字符串(其中后j个字符与s ...

  9. BZOJ1009: [HNOI2008]GT考试(KMP+矩阵乘法)

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

随机推荐

  1. HTML5 位运算符

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. 8.tomcat认证访问

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 接上例:namespce的作用除了在前面提到的避免协同开发名字冲突外,还为认 ...

  3. Java实现邮箱发送

  4. ListView 操作

    TListItem *Item; ; i < ; i++) { Item = ListView1->Items->Add(); Item->Caption = i; } Lis ...

  5. maven错误

    maven-enforcer-plugin (goal "enforce") is ignored by m2e. Plugin execution not covered by ...

  6. ubuntu编译安装php7, 安装openssl

    sudo apt-get install openssl sudo apt-get install libssl-dev

  7. 复习:使用HTML编写简单程序

    今天我试着用HTML编写了九九乘法表 代码如下 浏览器显示如下 2.输出静夜思 代码如下 2.浏览器显示

  8. 读取数据库信息并生成表设计文档Word版本

    1.参考C#代码 using Help.DBAccessLayer.Business; using Help.DBAccessLayer.Model.SqlGenerator; using Newto ...

  9. tensor flow 安装

    http://blog.csdn.net/nxcxl88/article/details/52704877?locationNum=13 安装后,一定要运行这句话后   $ source activa ...

  10. 关于访问asp.net网站时登录后的奇怪问题

    登录后,地址栏地址变成了 http://www.XXXX.com/(F(HDc3otfFs0wkZu4P4CjZ50Qkck2q8aekR3g6F0m_NRZRo7kt7XQ6CjAFBR4PR8kZ ...