gcd(i, j) = k的个数

: 题目:
i = 1 n j = 1 m [ g c d ( i , j ) = k ] \sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i, j)=k]

做法:

f ( k ) g c d ( i , j ) = k 设f(k)为gcd(i,j)=k的个数 , g ( k ) k g c d ( i , j ) g(k)为满足k|gcd(i,j)的对数 那么有下面的关系
g ( k ) = x = 1 n k f ( k x ) g(k)=\sum_{x = 1}^{\lfloor\frac{n}{k}\rfloor}f(kx)

g ( k ) , i , j k i = k x 1 , j = k x 2 , x 1 , x 2 , 我们只需要快速求出g(k) ,可知如果i,j能被k整数,那么它们可以写成i = k\cdot x_{1}, j = k \cdot x_{2}的形式, 我们只需求多少对x_{1},x_{2}即可,可得
g ( k ) = n k m k g(k) = \lfloor\frac{n}{k}\rfloor\lfloor\frac{m}{k}\rfloor

f ( k ) 根据莫比乌斯反演的变形,可求得f(k)

f ( k ) = x = 1 n k μ ( x ) g ( k x ) = x = 1 n k n k x m k x f(k) = \sum_{x = 1}^{\lfloor\frac{n}{k}\rfloor}\mu(x)g(kx) =\sum_{x = 1}^{\lfloor\frac{n}{k}\rfloor} \lfloor\frac{n}{kx}\rfloor\lfloor\frac{m}{kx}\rfloor

f ( k ) , O ( n ) 使 , n d O ( n ) 显然f(k)就是答案,暴力求复杂度是O(n)的,如何快速求?\\这里可以使用数论分块来做, \lfloor\frac{n}{d}\rfloor最多有O(\sqrt{n}个取值)

O ( n + m ) 复杂度可以做到O(n+m)

猜你喜欢

转载自blog.csdn.net/dezhonger/article/details/88810110
今日推荐