[HNOI2008]GT考试(luogu)

  • Description

求有多少个n位的数字串不包含m位的字符串(范围 n <= 1e9 n<=1e9, m <= 20m<=20)

  • Solution

f[i][j]表示以数字串i位结尾有j个匹配的字符

g[i][j]表示从i个字符匹配到j个字符匹配的方案数

dp方程如下:

f[i][j]=f[i-1][k]*g[k][j] (0<=k<m)

发现g数组可以用kmp预处理出来,然后上矩阵乘法

  • Code
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define ll long long
using namespace std;
const int N=;
ll n,p,g[N][N],d[N][N],pre[N][N];
int m,nxt[N];
char s[N];
void mul1()
{
memset(pre,,sizeof(pre));
for(int i=;i<m;i++)
for(int j=;j<m;j++)
for(int k=;k<m;k++)
pre[i][j]=(pre[i][j]+g[i][k]*g[k][j])%p;
for(int i=;i<m;i++)
for(int j=;j<m;j++)
g[i][j]=pre[i][j]%p;
}
void mul2()
{
memset(pre,,sizeof(pre));
for(int i=;i<m;i++)
for(int j=;j<m;j++)
for(int k=;k<m;k++)
pre[i][j]=(pre[i][j]+d[i][k]*g[k][j])%p;
for(int i=;i<m;i++)
for(int j=;j<m;j++)
d[i][j]=pre[i][j]%p;
}
void ksm(ll x)
{
while(x)
{
if(x&) mul2();
mul1(),x>>=;
}
}
int main()
{
scanf("%lld%d%lld",&n,&m,&p);
scanf("%s",s+);
nxt[]=;
int k=;
for(int i=;s[i];i++)
{
while(k> && s[k+]!=s[i]) k=nxt[k];
if(s[k+]==s[i]) k++;
nxt[i]=k;
}
for(int i=;i<m;i++)
for(int j=;j<=;j++)
{
char wh=''+j;
int k=i;
while(k && s[k+]!=wh) k=nxt[k];
if(s[k+]==wh) k++;
if(k<m) g[i][k]++;
}
for(int i=;i<m;i++) d[i][i]=;
ksm(n);
ll ans=;
for(int i=;i<m;i++)
ans=(ans+d[][i])%p;
printf("%lld\n",ans%p);
return ;
}

最新文章

  1. wap支付宝接口的问题
  2. Day1(2016/1/21)——Beginning
  3. STL--vector(转载)
  4. 服务器端spice配置详解
  5. jquery判断浏览器版本插件,jquery-browser.js
  6. MarkDown使用 (一)
  7. 关于grub的那些事(三)
  8. [置顶] Oracle学习经验谈
  9. JavaScript特效制作经典精讲(案例入门详解、可直接粘贴拷贝运行、史上最牛案例)
  10. 15套java架构师大型分布式综合项目实战、千万高并发-视频教程
  11. Java学习6——基本数据类型及其转换
  12. Docker搭建MongoDB
  13. Charles手机抓包常见问题(各种常见坑)
  14. GNU C 与 ANSI C(上)
  15. Angularjs 学习笔记-2017-02-05-初识Angular及app、model、controller、repeat指令和fileter、orderBy
  16. eclipse 编辑代码区字体大小
  17. 转: linux centos7 下安装maven
  18. Linux之包管理工具总结[RPM/DPKG]-[YUM/APT]
  19. SpringBoot与docker
  20. position的absolute与fixed,absolute与relative共同点与不同点

热门文章

  1. MFC入门
  2. web.config修改文件修改上传大小
  3. Raid相关操作与注意事项记录
  4. 适配器模式 iOS
  5. 对QT中QBitArray类进行简单剖析
  6. TCP/IP|| 建立连接或终止
  7. 021 Ceph关于too few PGs per OSD的问题
  8. C++版本的UnEscape 解析\uxxxx\uxxxx编码字符
  9. 洛谷$P4322\ [JSOI2016]$最佳团体 二分+$dp$
  10. 洛谷$P4149\ [IOI2011]\ Race$ 点分治