[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. U盘出现大量乱码文件,并且不能彻底删除

    问题如图所示: 问题出现原因:不正常的插拔等情况造成的,导致U盘的文件分配表错乱了 解决方法:参考http://bbs.cfanclub.net/thread-405004-1-1.html 运行ch ...

  2. three.js_ "Failed to execute 'texImage2D' on 'WebGLRenderingContext': tainted canvases may not be loded."

    这个报错是请求图片跨域了. 1.当我们使用thee.js的时候肯定会碰到利用各种请求去向服务器请求贴图. 2.假设我们获取的是图片在服务器上的路径然后我们用 加载贴图到这里都是没有问题当我们在贴图加载 ...

  3. 记一次powershell反混淆(2)

    样本地址 https://www.hybrid-analysis.com/sample/4b4b8b13c264c8f7d7034060e0e4818a573bebc576a94d7b13b4c174 ...

  4. python基础===对字符串进行左右中对齐

    例如,有一个字典如下: >>> dic = { "name": "botoo", "url": "http:// ...

  5. 64_t4

    texlive-hardwrap-svn21396.0.2-33.fc26.2.noarch.rpm 24-May-2017 15:41 35930 texlive-harmony-doc-svn15 ...

  6. 「caffe编译bug」.build_release/lib/libcaffe.so: undefined reference to cv::imread

    转自:https://www.douban.com/note/568788483/ CXX/LD -o .build_release/tools/convert_imageset.bin.build_ ...

  7. C/C++——[04] 语句

    在 C/C++语言中,语句以“ :”结束.某些情况下,一组语句在一起共同完成某一特定的功能,可以将它们用大括号括起来.我们称之为语句组.语句组可以出现在任何单个语句出现的地方. 1. 分支语句 一般情 ...

  8. awk中NF,NR的含义

    awk中NF和NR的意义,其实你已经知道NF和NR的意义了,NF代表的是一个文本文件中一行(一条记录)中的字段个数,NR代表的是这个文本文件的行数(记录数).在编程时特别是在数据处理时经常用到.建议你 ...

  9. 模块定义文件.def

    一作用 DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport),这里不再举例说明:另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供 ...

  10. 微信小程序-textarea中的文本读取以及换行问题

    今天客户那边要求textarea中输入的问题可以按回车键换行,而我使用的是bindinput获取值,但是呢bindinput 处理函数的返回值并不会反映到 textarea 上,按回车键导致点击换行符 ...