我们用DP来解决这个问题

W[I,J]表示准考证的第I位,和不吉利的数匹配到了第J位的方案数,这个状态的表示也可以看成

当前到第I位了,准考证的后J位是不吉利的数的前J位,的方案数

那么我们最后的ans=ΣW[N,I]  0<=I<=M-1

那么我们考虑怎么转移

假设当前到第I位了,匹配到第J位,也就是W[I,J]的值我们有了,我们可以枚举第I+1位是什么,

然后通过KMP的NEXT数组可以快速的得到当前枚举的位可以匹配到第几位,假设可以匹配到第P位,

那么我们W[I+1,P]+=W[I,J],这样就可以转移了

但是我们看N的数据范围是10^9,所以递推是完不成的,这时候需要观察下规律

我们发现转移时的P,J和I是没有关系的,也就是不管I是几,W[I,J]固定会加到W[I+1,K]上

所以我们换一种转移的方式,之前是用W[I,J]更新W[I+1,P],现在我们可以写成

W[I,J]=a0*W[I-1,0]+a1*W[I-1,1]+......+a(m-1)*W[I-1,M-1]

而且ai数组是不变的,那么这个式子就是常系数线性齐次递推式(新买的书上把这个式子叫这个。。),

然后我们可以用矩阵乘法加速,在log级别中求出ans

/**************************************************************
    Problem:
    User: BLADEVIL
    Language: Pascal
    Result: Accepted
    Time: ms
    Memory: kb
****************************************************************/
 
//By BLADEVIL
type   
    rec                     =array[..,..] of longint;
     
var
    s                       :ansistring;
    pre                     :array[..] of longint;
    n, m, d39               :longint;
    sum, ans                :rec;
    cur                     :longint;
     
procedure init;
var
    i, j, k                 :longint;
    c                       :ansistring;
begin
    readln(n,m,d39);
    readln(s);
    j:=;
    for i:= to m do
    begin
        while (s[i]<>s[j+]) and (j<>) do j:=pre[j];
        if s[i]=s[j+] then
        begin
            inc(j);
            pre[i]:=j;
        end;
    end;
     
    for i:= to m- do
        for j:= to do
        begin
            str(j,c);
            k:=i;
            while (s[k+]<>c) and (k<>) do k:=pre[k];
            if s[k+]=c then inc(k);
            inc(sum[i,k]);
        end;
end;
 
function mul(a,b:rec):rec;
var
    i, j, l                 :longint;
begin
    fillchar(mul,sizeof(mul),);
    for i:= to m- do
        for j:= to m- do
            for l:= to m- do mul[i,j]:=(mul[i,j]+a[i,l]*b[l,j]) mod d39;
     
end;
 
procedure main;
var
    p                       :longint;
    i                       :longint;
begin
    for i:= to m do ans[i,i]:=;
    p:=n;
    while p<> do
    begin
        if p mod = then ans:=mul(ans,sum);
        p:=p div ;
        sum:=mul(sum,sum);
    end;
    for i:= to m- do cur:=(cur+ans[,i]) mod d39;
    writeln(cur);
end;
 
begin
    init;
    main;
end.

bzoj 1009 DP+矩阵加速的更多相关文章

  1. bzoj 1009 DP 矩阵优化

    原来的DP: dp[i][j]表示长度为i的合法串,并且它的长度为j的后缀是给定串的长度为j的前缀. 转移: i==0 dp[0][0] = 1 dp[0][1~m-1] = 0 i>=1 dp ...

  2. bzoj 4037: [HAOI2015]数字串拆分【dp+矩阵加速】

    首先f长得就很像能矩阵优化的,先构造转移矩阵(这里有一点神奇的地方,我看网上的blog和我构造的矩阵完全不一样还以为我的构造能力又丧失了,后来惊奇的发现我把那篇blog里的构造矩阵部分换成我的构造方式 ...

  3. HDU 5564 Clarke and digits 状压dp+矩阵加速

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5564 题意: 求长度在[L,R]范围,并且能整除7的整数的总数. 题解: 考虑最原始的想法: dp[ ...

  4. Codeforces Round #341 (Div. 2) E. Wet Shark and Blocks dp+矩阵加速

    题目链接: http://codeforces.com/problemset/problem/621/E E. Wet Shark and Blocks time limit per test2 se ...

  5. P5343 【XR-1】分块(dp矩阵加速)

    \(大意是用数组a里的数字,组成一个序列,使得序列和为n的方案种数\)传送门 \(先考虑dp.\) \(但是不能直接用背包转移,因为是序列,要考虑顺序.\) \(所以,为了去重,我们令dp[i][j] ...

  6. bzoj2004公交线路——DP+矩阵加速递推

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 求方案数,想到DP: 因为两个站间距离<=p,所以每p个站中所有车一定都会停靠至 ...

  7. [Bzoj2004][Hnoi2010]Bus 公交线路(状压dp&&矩阵加速)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 看了很多大佬的博客才理解了这道题,菜到安详QAQ 在不考虑优化的情况下,先推$dp ...

  8. BZOJ 1875(DP+矩阵快速幂)

    题面 传送门 分析 容易想到根据点来dp,设dp[i][j]表示到i点路径长度为j的方案数 状态转移方程为dp[i][k]=∑(i,j)∈Edp[j][k−1]" role="pr ...

  9. AC日记——[HNOI2008]GT考试 bzoj 1009

    1009 思路: KMP上走DP(矩阵加速): DP[i][j]表示当前在第i位,同是匹配到不吉利串的第j位的方案数: 代码: #include <bits/stdc++.h> using ...

随机推荐

  1. c++ class as sort function

    // constructing sets #include <iostream> #include <set> #include <string.h> bool f ...

  2. jenkins使用Role Strategy管理用户权限

    下载插件地址:https://wiki.jenkins.io/display/JENKINS/Role+Strategy+Plugin 1. 安装好插件后,进入jenkins系统管理的Configur ...

  3. jmeter插件之jsonpath提取响应结果和做断言

    准备工作: 1. jmeter3.X已经自带了提取响应结果的插件:JSON Extractor 2. 下载断言插件:https://jmeter-plugins.org/wiki/JSONPathAs ...

  4. python------- IO 模型

                                                    IO模型介绍                                               ...

  5. [USACO19JAN]Cow Poetry

    题面 Solution: 这是一道很好的dp题. 一开始看不懂题面没有一点思路,看了好久题解才看懂题目... \(y[i]\) 为第 \(i\) 个词结尾,\(l[i]\) 为第 \(i\) 个词长度 ...

  6. Ubuntu18.04 + CUDA9.0 + cuDNN7.3 + Tensorflow-gpu-1.12 + Jupyter Notebook深度学习环境配置

    目录 一.Ubuntu18.04 LTS系统的安装 1. 安装文件下载 2. 制作U盘安装镜像文件 3. 开始安装 二.设置软件源的国内镜像 1. 设置方法 2.关于ubuntu镜像的小知识 三.Nv ...

  7. deeplearning.ai课程学习(3)

    第三周:浅层神经网络(Shallow neural networks) 1.激活函数(Activation functions) sigmoid函数和tanh函数两者共同的缺点是,在z特别大或者特别小 ...

  8. AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程

    AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程 0x00 项目简述 Ammbr主要目标是打造具有高度弹性且易于连接的分布式宽带接入平台,同时降低上网相关成本.Ammbr打算创建具有人工智能和智 ...

  9. eth day05

    智能合约众筹实战 淘宝众筹,京东众筹 https://izhongchou.taobao.com/index.htm 分析商业模式 解决京东众筹的痛点 https://izhongchou.taoba ...

  10. Week1 Team Homework #1 from Z.XML-总结学长经验教训

    谭传奇学长: 我们的弯路可能是,一开始没有从最基础的部分开始迭代开发,一开始就想的太远了一些,每一步开的有点太大了,所以可能有些东西最后就连不上,也没有能够按时完成.如果可以先做出一个能用的版本,然后 ...