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出现的位置记录下来。
然后一个同余类个数直接相乘即可。
最后,再乘上循环节循环次数。
代码:
原文地址:https://www.cnblogs.com/Miracevin/p/9726275.html