[NC13C]形态形成场/[Gym100430B]Divisible Substrings

题目大意:

有\(m(m\le26)\)个字符串替换式\(S_i(|S_i\le100|)\),表示某个大写字母对应的字符串。比如\(A\rightarrow BB,B\rightarrow CC0,C\rightarrow 123\),代表 \(A=12312301231230,B=1231230,C=123\)。最后一个对应串只包含数字,其余只包含数字和在它之后的大写字母。字母由'A'开始依次出现,问'A'所代表的字符串有多少子串满足:

  • 这个子串为单个字符'0'或没有前导'0'
  • 把这个子串看作一个十进制数后模\(n(n\le30)\)等于\(0\)。

答案对\(r(r\le10^9)\)取模。

思路:

对于每一段字符串维护其必要信息,每次暴力合并维护信息。具体见代码注释。

源代码:

#include<cstdio>
#include<cctype>
#include<cstring>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
typedef long long int64;
const int K=26,S=101,N=30,D=10;
int n,mod,m;
char s[K][S];
struct Node {
int num,cnt,len,pre[N][N],suf[N];
//num: 值%n
//cnt: 满足条件的子串数
//len: 10^{长度}%n
//pre[i][j]: 前缀num=i、len=j个数
//suf[i]: 后缀num=i个数
};
Node t[D],f[K];
inline void merge(Node &a,const Node &b) {
(a.cnt+=b.cnt)%=mod;
for(register int i=0;i<n;i++) {
for(register int j=0;j<n;j++) {
const int k=(n-(int64)i*j%n)%n;
(a.cnt+=(int64)b.pre[k][j]*a.suf[i]%mod)%=mod;
}
}
for(register int i=0;i<n;i++) {
for(register int j=0;j<n;j++) {
(a.pre[((int64)a.num*j+i)%n][j*a.len%n]+=b.pre[i][j])%=mod;
}
}
int tmp[n];
memcpy(tmp,b.suf,sizeof tmp);
for(register int i=0;i<n;i++) {
(tmp[((int64)i*b.len+b.num)%n]+=a.suf[i])%=mod;
}
memcpy(a.suf,tmp,sizeof tmp);
a.num=((int64)a.num*b.len+b.num)%n;
a.len=(int64)a.len*b.len%n;
}
int main() {
freopen("divisible.in","r",stdin);
freopen("divisible.out","w",stdout);
n=getint(),mod=getint(),m=getint();
for(register int i=0;i<m;i++) {
while(getchar()!='>');
scanf("%s",s[i]);
}
for(register int i=0;i<D;i++) {
t[i].num=i%n;
t[i].cnt=i%n==0;
t[i].len=10%n;
t[i].pre[i%n][10%n]=1;
t[i].suf[i%n]=i!=0;//0本身不可以作为后缀进行合并
}
for(register int i=m-1;i>=0;i--) {
f[i].len=1;
for(register int j=0;s[i][j];j++) {
merge(f[i],isdigit(s[i][j])?t[s[i][j]-'0']:f[s[i][j]-'A']);
}
}
printf("%d\n",f[0].cnt);
return 0;
}

[NC13C]形态形成场/[Gym100430B]Divisible Substrings的更多相关文章

  1. 形态形成场(矩阵乘法优化dp)

    形态形成场(矩阵乘法优化dp) 短信中将会涉及前\(k\)种大写字母,每个大写字母都有一个对应的替换式\(Si\),替换式中只会出现大写字母和数字,比如\(A→BB,B→CC0,C→123\),代表 ...

  2. 牛客挑战赛33 F 淳平的形态形成场(无向图计数,EGF,多项式求逆)

    传送门: 淳平的形态形成场 题解: 把a排序后,直接统计答案恰好为a[i]并不好做,可以统计答案>a[i]的方案数,设为\(f[i]\). 即不存在一个联通块,所有的权值都<=a[i]. ...

  3. HJA的异或值

    HJA的异或值 查看 提交 统计 提问 总时间限制:  20000ms 内存限制:  512000kB 描述 形态形成场(Morphogenetic Field)假说是Rupert Sheldrake ...

  4. 微软2016校园招聘在线笔试第二场 题目1 : Lucky Substrings

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 A string s is LUCKY if and only if the number of different ch ...

  5. Kattis之旅——Divisible Subsequences

    Given a sequence of positive integers, count all contiguous subsequences (sometimes called substring ...

  6. [CF百场计划]Codeforces Round #617 (Div. 3)

    A. Array with Odd Sum Description You are given an array \(a\) consisting of \(n\) integers. In one ...

  7. Dynamics CRM 之ADFS 使用 WID 的联合服务器场

    使用 WID 的联合服务器场 默认拓扑 Active Directory 联合身份验证服务 (AD FS) 是联合服务器场,使用 Windows 内部数据库 (WID). 在这种拓扑, AD FS 使 ...

  8. CATransition自定义转场动画

    我们可以通过CATransiton来自定义一些漂亮的转场动画, CATransition继承自CAAnimation, 所以用法跟CAAnimation差不多 先直接上一个代码: #import &q ...

  9. Dynamics CRM 之ADFS 使用 SQL Server 的联合服务器场

    此拓扑用于 Active Directory 联合身份验证服务 (AD FS) 不同于使用 Windows 内部数据库 (WID) 部署拓扑,因为不会将数据复制到每台联合服务器场中的联合身份验证服务器 ...

随机推荐

  1. B - GuGuFishtion(莫比乌斯 欧拉函数 预处理mu函数的欧拉函数的模板)

    题目链接:https://cn.vjudge.net/contest/270608#problem/B 题目大意:题目中说,就是对欧拉函数的重新定义的一种函数的求和. 证明方法: AC代码: #inc ...

  2. CRF原理解读

    概率有向图又称为贝叶斯网络,概率无向图又称为马尔科夫网络.具体地,他们的核心差异表现在如何求  ,即怎么表示  这个的联合概率. 概率图模型的优点: 提供了一个简单的方式将概率模型的结构可视化. 通过 ...

  3. php隐藏WEBSHELL技巧

    把shell添加到网站logo图片里: cat logo.png shell.php > logo.png 在网站任意一个php文件里添加下面的最简单方法: fputs(fopen('/home ...

  4. 安装 Google BBR 加速VPS网络

    Google BBR就是谷歌公司提出的一个开源TCP拥塞控制的算法.详情可以看这儿:https://lwn.net/Articles/701165.https://blog.sometimesnaiv ...

  5. 72.xilinx vivado zynq vdma仿真及应用详解(一)

    很多人用zynq平台做视频图像开发,但是对vdma了解比较少,上手起来稍微有些困难,我针对这一现象,做了一个基于vivado和modelsim的仿真和应用测试工程,并写篇文章做些介绍,希望能对大家有帮 ...

  6. 【项目管理】git和码云的使用【转】

    转自:https://www.cnblogs.com/riverdubu/p/6491944.html 缘起 说了那么多关于git和码云相关的事,一直都没给大伙讲解这个码云究竟是个啥玩意儿. 今天就给 ...

  7. FPM定制RPM包

    安装FPM FPM是ruby写的打包工具,ruby版本要大于1.8.5 #安装ruby环境和gem包管理器 [root@test88 ~]# yum install -y ruby rubygems ...

  8. Linux中常用命令 <一>

    本笔记中记录的命令来源于 <Linux C 编程实战> ------------------------------------------------------------------ ...

  9. U3D的一些常用基础脚本

    修改渲染颜色和贴图 1: var texture :Texture ; 2:  3: function Start () { 4: renderer.material.mainTexture = te ...

  10. MVC – 3.EF(Entity Framework)

    1.实体框架(EF)简介 与ADO.NET的关系 全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框 ...