题目描述:
定义两个长度为L
的字符串
s
=
s
1
s
2
.
.
.
.
.
s
L
s=s_1s_2.....s_L
s=s1s2.....sL和
t
=
t
1
t
2
.
.
.
.
.
t
L
t=t_1t_2.....t_L
t=t1t2.....tL之间的距离为所有满足
s
i
≠
t
i
s_i\ne t_i
si=ti的位置i
的个数。例如字符串"abac"
和"cbcc"
的距离为2,因为第一位和第三位上对应的字符不同。
现在请你求出两个字符串a
和b
的距离。字符串a
是将字符串x
复制n
份后接在一起的,相应地,字符串b
是将字符串y
复制m
份后接在一起的。例如,若 字符串x
为"aba"
,n
为3
,那么字符串a
为"abaabaaba"
数据范围:
1
≤
n
,
m
≤
1
0
12
1\le n,m\le 10^{12}
1≤n,m≤1012
x
,
y
均由小写字母组成,且
∣
x
∣
,
∣
y
∣
≤
1
0
6
x,y均由小写字母组成,且\lvert x\rvert,\lvert y\rvert\le 10^6
x,y均由小写字母组成,且∣x∣,∣y∣≤106
其中
∣
x
∣
表示字符串
x
的长度
其中\lvert x\rvert表示字符串x的长度
其中∣x∣表示字符串x的长度
样例输入:
2 3
rzr
az
样例输出:
5
思路:
我们可以找一下规律,会发现:
找最小公倍数长度内,两个字符串之间位置对最大公约数取余数相同的字符,是对应的
对应位置的字符不同距离就+1
但要注意:这个题要爆longlong
核心代码:
__int128 gc=__gcd(x.size(),y.size()),lc=x.size()*y.size()/gc;
for(ll i=0;i<x.size();i++)vis[{x[i],i%gc}]++;
for(ll i=0;i<y.size();i++)ans+=x.size()/gc-vis[{y[i],i%gc}];
write(ans*n*(__int128)x.size()/lc);
THE END