码迷,mamicode.com
首页 > 其他好文 > 详细

9.29模拟赛

时间:2018-09-29 20:25:58      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:http   idt   个数   family   bubuko   枚举   str   image   等价   

T1:

技术分享图片

【数据范围】

    40%的数据满足 A<=105

另有30%的数据满足N,M<=109 |S|,|T|<=10(|S|表示S的长度);

100%的数据满足 N,M<=109 |S|,|T|<=106

先求循环节内,即lcm(S,T)内,匹配数出现次数。

然后乘上循环次数即可。

就是S,T内对d=gcd(S,T)同余的位置的相等字符对数的数量。

可以证明.

证明:

设S长度为l1,T长度为l2

如果一个S中位置a的字符和T中位置b的字符相同。

如果可以在循环节内匹配上的话。

那么满足存在k1,k2:a+k1*l1=b+k2*l2

我们现在要找,k1,k2是否存在,有几个。

移项:k1*l1-k2*l2=b-a;

有解条件是:d=gcd(l1,l2)|(b-a),否则k1,k2不存在

(b-a的正负对解的有无无关紧要,假设是正数)

假设有解,设x=(b-a)/d;

那么,同时除以d,可以有:k1*l1‘-k2*l2‘=x;

其中,l1‘,l2‘互质。

那么就有,k1*l1‘=x+k2*l2‘

有:k1*l1‘=x mod (l2‘)

并且,由于x小于l2‘,所以,如果存在一个非负整数k1,符合方程,那么一定有一个唯一的非负整数的k2

所以等价于同余方程k1*l1‘=x mod (l2‘)的k1有几个非负整数解。

由于l1‘,l2‘互质,所以,存在一个小于l2‘的k1=x*l1‘^(-1) mod (l2‘)

 

那么,这个k1能否加上若干倍的l2‘呢?

 

发现,

其实现在k1有了一个条件

因为现在是在循环节的内部,而0<=a<l1;

而lcm=l2‘*l1

所以,0<=k1<l2‘,否则就超出了lcm

由于l1‘,l2‘互质,所以,存在一个k1=x*l1‘^(-1) mod (l2‘)

而k1不能大于等于l2‘,所以,这个k1有且只有一个。

 

现在我们证明了,

d=gcd(l1,l2)|(b-a)时,在循环节内有且只有一次a,b匹配的机会。

所以,我们可以枚举字符char∈a~z

把字符都是char的两个位置 b,a关于d的余数分类。

余数相同的ai,bi位置一定会匹配一次。因为做差一定是d的倍数。

所以,我们可以每次扫两遍S,T把char出现的位置记录下来。

然后一个同余类个数直接相乘即可。

最后,再乘上循环节循环次数。

 

代码:

 

9.29模拟赛

标签:http   idt   个数   family   bubuko   枚举   str   image   等价   

原文地址:https://www.cnblogs.com/Miracevin/p/9726275.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!