首先取补集。
即枚举 i=agcd(a,b),j=bgcd(a,b),d=gcd(a,b),条件即 gcd(i,j)=1,dij≤n。
固定了 i,j 后,d 的取值只有 ⌊nij⌋ 种。
然后有 n∑i=1n∑j=1[gcd(i,j)=1]⌊nij⌋=n∑i=1n∑j=1⌊nij⌋∑d|gcd(i,j)μ(d)=n∑d=1μ(d)⌊nd⌋∑i=1⌊nd⌋∑j=1⌊nd2ij⌋
修正上界,原式变为 ⌊√n⌋∑d=1μ(d)⌊nd2⌋∑i=1⌊nd2i⌋∑j=1⌊nd2ij⌋
设 f(n)=n∑i=1⌊ni⌋∑j=1⌊nij⌋。
发现后面的和式很有趣,如果能求出 g(n)=n∑i=1⌊ni⌋ 就可以数论分块了。
观察发现 g 的定义,发现 g(n)=n∑i=1σ0(i)。
于是可以类似杜教筛,先筛出 n2/3 以内的 g 值,然后在 n2/3 以外的 g 值暴力数论分块做。
可以发现这一部分很像杜教筛所以复杂度也不会超过 O(n2/3)(人家还没递归)
其实可以令 σ0∗μ 得到 1 这样就可以了两遍杜教筛带走了(但是常数过大)
然后对 f 数论分块,求出 ⌊√n⌋∑d=1μ(d)f(⌊nd2⌋) 即可。
别忘了取补集回去。
代码:
1 |
|