题目链接
解题方法:莫比乌斯反演
题目分析
题目大意
给出a, b, c, d, k
,求1<=x<=b, 1<=y<=d
范围内有多少组(x, y)
满足gcd(x, y) == k
解析
先了解一下莫比乌斯公式的两种表达形式:
其中mu[]
我们可以通过筛法求出。
我们分析一下这个问题,如果要找gcd为k的解,我们可以把区间先缩短为原来的1/k
,那么,我们只需要找1<=x<=b/k, 1<=y<=d/k
范围内有多少组(x, y)
满足gcd(x, y) == 1
的解。
然后就是莫比乌斯反演的解决方法了。
我们可以先找到一个大范围F(n)
表示满足对于(x, y)
,n|gcd(x, y)
,也就是说,gcd(x, y)
可以是n, 2n, 3n, 4n, ...
,根据区间,我们很容易发现F(n) = (b/n)*(d/n)
。然后我们可以找到一个小范围f(n)
表示满足对于(x, y)
,n=gcd(x, y)
,也就是说,gcd(x, y)
只能是n
。至此,我们可以发现我们应该应用莫比乌斯公式的第二种表现形式,由于我们已经把区间整体处以k
了,所以我们只需要找1<=x<=b/k, 1<=y<=d/k
范围内的f(1)
,即为解。然后我们根据f(n)
的计算公式,枚举d从1~min(b/k, d/k)
,求出∑mu(d)F(d)即可。
最后还有一点值得注意的,对于n<m
,我们求的实际上是(1, n)
区间和(1, m)
中的对数,但是在(1, n)
和(1, n)
中会产生一些重复的,比如q<p<n<m
,那么我们对于第一个区间计算(q, p)
时,已经计算了一遍(q, p)
又计算了一遍(p, q)
,但是如果q<n<p<m
,我们只会计算一遍(q, p)
。所以我们要把重复的部分删掉,即mobius(n, n)/2
对情况。
代码
1 |
|