首先,为了去重,我们可以增加一个限制:必须是最简分数。
然后我们看看什么情况会产生纯循环小数。
在 10 进制下,当 gcd(x,y)=1,gcd(x,10)=1 时,yx 是纯循环小数。
于是我们猜测当 gcd(x,y)=1,gcd(x,k)=1 时,yx 在 k 进制下是纯循环小数。
证明:
yx 在 k 进制下是纯循环小数,当且仅当 ∃l≠0,yx−⌊yx⌋=yklx−⌊yklx⌋。
这玩意看着很像取模的形式,所以两边同乘 x,变成 y≡ykl(modx)。
由于前面说了 gcd(x,y)=1,所以 kl≡1(modx)。
于是由欧拉定理得 gcd(k,x)=1,一个特解为 l=φ(x)。
证毕。
问题变成了 n∑i=1m∑j=1[gcd(i,j)=1][gcd(j,k)=1]。
n∑i=1m∑j=1[gcd(i,j)=1][gcd(j,k)=1]=m∑j=1[gcd(j,k)=1]n∑i=1[gcd(i,j)=1]=m∑j=1[gcd(j,k)=1]n∑i=1∑d|i,d|jμ(d)=m∑j=1[gcd(j,k)=1]∑d|j⌊nd⌋μ(d)=min(n,m)∑d=1⌊nd⌋μ(d)∑jd≤m[gcd(jd,k)=1]=min(n,m)∑d=1⌊nd⌋[gcd(d,k)=1]μ(d)∑jd≤m[gcd(j,k)=1]
设 f(n)=n∑i=1[gcd(i,k)=1]。
由于 gcd(i,k)=gcd(i+k,k),有 f(n)=⌊nk⌋φ(k)+f(nmodk)。
发现 k 非常小,暴力求出 x∈[0,k] 的 f(x) 值即可。
于是有 min(n,m)∑d=1⌊nd⌋[gcd(d,k)=1]μ(d)∑jd≤m[gcd(j,k)=1]=min(n,m)∑d=1⌊nd⌋f(⌊md⌋)[gcd(d,k)=1]μ(d)
如果数论分块的话,就剩下后面的两项。
考虑怎么算它们的前缀和。
设 S(n,k)=n∑i=1[gcd(i,k)=1]μ(i)。
有 S(n,k)=n∑i=1[gcd(i,k)=1]μ(i)=n∑i=1μ(i)∑d|i,d|kμ(d)=∑d|kμ(d)∑id≤nμ(id)
乍一看推不下去了。
但是我们反观 μ 函数,根据定义容易发现当 gcd(x,y)≠1 时,μ(xy)=0。
所以有 S(n,k)=∑d|kμ(d)∑id≤nμ(id)=∑d|kμ(d)∑id≤n[gcd(i,d)=1]μ(id)=∑d|kμ2(d)∑id≤n[gcd(i,d)=1]μ(i)=∑d|kμ2(d)S(⌊nd⌋,d)
然后考虑递归求解 S,容易发现 S(n,1)=n∑i=1μ(i),杜教筛即可。
于是最后对于 min(n,m)∑d=1⌊nd⌋f(⌊md⌋)[gcd(d,k)=1]μ(d) 数论分块即可。
略微卡常,少开 long long,算 S 的时候如果系数是 0 就不用往下算。
unordered_map 居然不能用 pair,偷懒换成了 map(
代码:
1 |
|