HNOI2008GT考试

题目链接

考虑dp,f(i,j)表示做到了第i位(共n位),当前的后缀串与A1~Aj相匹配 接下来的方案数。转移的话枚举一个k=0~9表示这位选什么,如果选了以后,匹配的位置会改变到 j‘ ,j‘可以通过预处理A串的next数组(就是kmp里面的那个)然后不断向前跳得到,所以f(i,j) = ∑ f(i+1, j‘)。

发现转移系数与i无关,因此可以用next数组处理出系数矩阵(长宽均为m),再做矩阵快速幂即可。

复杂度O(m^3*logn)

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<map>
#include<queue>
#define P puts("lala")
#define cp cerr<<"lala"<<endl
#define ln putchar(‘\n‘)
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
inline int read()
{
    char ch=getchar();int g=1,re=0;
    while(ch<‘0‘||ch>‘9‘) {if(ch==‘-‘)g=-1;ch=getchar();}
    while(ch<=‘9‘&&ch>=‘0‘) re=(re<<1)+(re<<3)+(ch^48),ch=getchar();
    return re*g;
}
typedef long long ll;
typedef pair<int,int> pii;

const int M=25;
struct mat
{
    int n,m;
    int s[M][M];
    mat() {clean();}
    void clean() {memset(s,0,sizeof(s));n=m=0;}
};
int mod;

mat operator * (mat a,mat b)
{
    mat c;
    c.n=a.n; c.m=b.m;
    for(int i=0;i<a.n;++i) for(int j=0;j<b.m;++j) for(int k=0;k<a.m;++k)
        c.s[i][j]=(c.s[i][j]+a.s[i][k]*b.s[k][j]%mod)%mod;
    return c;
}
mat fpm(mat a,int n)
{
    mat ans;
    ans.n=ans.m=a.n;
    for(int i=0;i<a.n;++i) ans.s[i][i]=1;
    for(;n;n>>=1,a=a*a) if(n&1) ans=ans*a;
    return ans;
}

mat X,V;
char s[M];
int n,m,next[M];

int main()
{
#ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);freopen("1.out","w",stdout);
#endif
    int i,j,opt,T;
    n=read();m=read();mod=read();
    scanf("%s",s+1);
    next[1]=0;
    int k=0;
    for(i=2;i<=m;++i)
    {
        while(k>0&&s[k+1]!=s[i]) k=next[k];
        if(s[k+1]==s[i]) k++;
        next[i]=k;
    }
    for(i=0;i<m;++i)
    {
        for(j=0;j<10;++j)
        {
            int k=i;
            while(k>0&&j!=s[k+1]-48) k=next[k];
            if(j==s[k+1]-48) k++;
            if(k<m) X.s[i][k]=(X.s[i][k]+1)%mod;
        }
    }
    X.n=X.m=m;
    V.n=m; V.m=1;
    for(i=0;i<m;++i) V.s[i][0]=1;
    X=fpm(X,n);
    X=X*V;
    printf("%d\n",X.s[0][0]%mod);
    return 0;
}
/*

*/
时间: 2024-08-30 18:01:16

HNOI2008GT考试的相关文章

【题解】HNOI2008GT考试

这题好难啊--完全不懂矩阵加速递推的我TAT 这道题目要求我们求出不含不吉利数字的字符串总数,那么我们有dp方程 : dp[i][j](长度为 i 的字符串,最长与不吉利数字前缀相同的后缀长度为 j 的方案数). dp[i][j] = Σdp[i - 1][k] * a[k][j] (a 数组表示从 k 状态转移到 j 状态的方案数).a 数组我们可以通过 kmp 对不吉利数字的每一个前缀后面加上'0'~'9'转移匹配得到(匹配成功表示成功转移状态,a[k][j]++;否则表示此时没有重合的后缀

高等代数期末考试

高等代数的最后一站,有惊无险. 高等代数期末考试试题

在线考试系统(Online Exam System)--ASP.NET

用户设计 -|学生 -|老师 -|管理员 学生结构设计 -|个人信息管理 -|修改个人信息 -|修改登录密码 -|选课中心 -|显示所有老师所开课的信息可进行选课 -|显示自己已选课程 -|在线考试 -|对已选老师开设的课程选择进行考试 -|成绩查询 -|查看自己考试成绩   老师结构设计 -|个人信息管理 -|修改个人信息 -|修改登录密码 -|课程管理 -|显示学校开设的课程(老师可选择添加课程) -|显示老师开设的课程 -|考试管理 -|显示老师自己开设的课程 -|对课程添加试题(选择.填

Java编程练习之输出考试成绩的前三名

在慕课网学习的时候遇到了这样一个Java编程练习题,正好对所学习的Java基础知识检验一下: 请根据所学知识,编写一个Java程序,实现输出考试成绩的前三名 要求: 1考试成绩已保存在数组scores中,数组元素依次为89 , -23 , 64 , 91 , 119 , 52 , 73 2要求通过自定义方法来实现成绩排名并输出操作,将成绩数组作为参数传入 3要求判断成绩的有效性( 0-100 ),如果成绩无效,则忽略此成绩 我自己分析了一下这个程序的过程: (1)首先是定义一个包含整型数组参数的

高级工程考试通过总结

2015年12月15日公布的高级工程师评审公示,我终于通过了,结果在意料之中,回过头来对整个过程进行总结,希望对考试的朋友有所帮助: 1.提前准备 (1)英语及计算机资格考试 高级工程师的考试有很多需要提前准备的,比如英语资格考试,计算机资格考试等,这些都应该在准备考试高工前搞定,这是必须条件. 计算机资格:http://www.bjrbj.gov.cn/bjpta/test_447/ksjs/jsj/ 英语资格考试:http://www.bjrbj.gov.cn/bjpta/test_447/

浙江大学软件学院三维动画与交互技术考试概念整理

第一讲 1.    增强现实技术AR: --融合了三维动画.立体视觉和图像处理: --建模.渲染.位置标定.图像融合: 2.    OpenGL是一种用于创建实时3D图像的编程接口. 3.    三维这个术语表示一个正在描述或显示的物体具有三维维度:宽度.高度.深度: --计算机3D图形实质上也是平面的: --在计算机屏幕上显示的二维图像,提供深度(或第三维)的错觉: 2D+透视 = 3D 透视使人产生深度的错觉. 4.    真正的3D是通过人的两只眼睛观察同一个物体,在视网膜上生成具有视差的

V5天下-安德揭密CCIEv5认证考试 就业和前途

在笔者看来,RSCCIEv5,这都不是事儿!您看Yeslab(上海)学员--来自思科的妹子一举拿下CCIEv5.0认证!!又一位double 女IE诞生 那么什么是事儿? 如何学习是事儿!这是我们提到的第一件事 笔者从最初的沁园公寓701室(Yeslab最原始的老巢),到沁园公寓907室(Yeslab的第一步扩张),之后搬到苏州长远天地1005室,又扩展到长远天地601室(Yeslab安全和DC的基地),再之后到,安德作为小弟和几位同僚奔赴上海这个国际大都市,我们的小圈子从华鼎大厦16D开始,而

数据库期末考试复习题 第一章

作者 : Dolphin 原文地址:http://blog.csdn.net/qingdujun/article/details/27820507 一.单项选择题: 1. 位于用户和操作系统之间的一层数据管理软件是  C    . A.DBS  B.DB  C.DBMS  D.MIS 2. 数据库系统中的数据模型通常由    A     三部分组成. A.数据结构.数据操作和完整性约束 B.数据定义.数据操作和安全性约束 C.数据结构.数据管理和数据保护 D.数据定义.数据管理和运行控制 3. 

分享CISSP CBT考试经验

各位前辈大家好:小弟在今年四月初通过了CISSP CBT考试,在这想跟大家分享一下准备心得与考试经验,让更多想通过考试的伙伴能对考试有更多的认识.我在2009年的10-11月份週二与週四晚间到参加汇哲开的CISSP课程,有老师系统性的介绍,让我入门的速度更快,不然有十个CBK,在日常工作是无法完全Cover的,补一个题外话,上完课没多久,我们公司不幸发生失火,此时BCP的训练就派上用场了,刚好可以验证所学与协助公司的MIS快速的回复系统资料,这也是让人意外的实务经验^ ^强烈建议刚开始准备的伙伴