我是靠谱客的博主 强健黑裤,最近开发中收集的这篇文章主要介绍luogu SP20173 DIVCNT2 - Counting Divisors (square)背景:题目传送门:题意:思路:代码:,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

背景:

一道好题,根据大佬的 b l o g blog blog学的。

题目传送门:

https://www.luogu.org/problemnew/show/SP20173

题意:

∑ i = 1 n σ ( i 2 ) sum_{i=1}^{n}σ(i^2) i=1nσ(i2)
其中 σ ( n ) σ(n) σ(n)表示 n n n的约数个数。

思路:

∑ i = 1 n σ ( i 2 ) sum_{i=1}^{n}σ(i^2) i=1nσ(i2)
考虑 x = p 1 a 1 p 2 a 2 . . . p k a k x=p_1^{a_1}p_2^{a_2}...p_k^{a_k} x=p1a1p2a2...pkak,则 σ ( x ) = ∏ i = 1 k ( a i + 1 ) σ(x)=prod_{i=1}^{k}(a_i+1) σ(x)=i=1k(ai+1)
x 2 = p 1 2 a 1 p 2 2 a 2 . . . p k 2 a k x^2=p_1^{2a_1}p_2^{2a_2}...p_k^{2a_k} x2=p12a1p22a2...pk2ak,则 σ ( x ) = ∏ i = 1 k ( 2 a i + 1 ) σ(x)=prod_{i=1}^{k}(2a_i+1) σ(x)=i=1k(2ai+1)
则原式子
= ∑ i = 1 n ∏ j = 1 k ( 2 a j + 1 ) =sum_{i=1}^{n}prod_{j=1}^{k}(2a_j+1) =i=1nj=1k(2aj+1)
考虑 ∏ j = 1 k ( 2 a j + 1 ) prod_{j=1}^{k}(2a_j+1) j=1k(2aj+1)的暴力求解,就是若干个 a a a与其它的 1 1 1暴力匹配,那不妨写成子集枚举的形式。
= ∑ i = 1 n ∑ S ⊆ { 1 , 2 , . . . , k i } 2 ∣ S ∣ ∏ j ∈ S a j =sum_{i=1}^{n}sum_{S⊆{1,2,...,k_i}}2^{|S|}prod_{j∈S}{a_j} =i=1nS{1,2,...,ki}2SjSaj
事实上,若存在 a j = 0 a_j=0 aj=0,那就没有贡献。那有贡献的就是 i i i的约数。
每个约数的贡献是 2 ω ( d ) 2^ω(d) 2ω(d),其中 ω ( i ) ω(i) ω(i)表示 i i i的质因数个数,所以就有:
= ∑ i = 1 n ∑ d ∣ i 2 ω ( d ) =sum_{i=1}^{n}sum_{d|i}2^{ω(d)} =i=1ndi2ω(d)
其实把 ω ( d ) ω(d) ω(d)看成每个质因数选或不选,就是 d d d的无平方约数的个数。则 2 ω ( d ) = ∑ p ∣ d μ 2 ( p ) 2^{ω(d)}=sum_{p|d}{mu^2(p)} 2ω(d)=pdμ2(p)

f n = σ ( n 2 ) , g n = 2 ω ( d ) , h n = μ 2 ( n ) f_n=σ(n^2),g_n=2^{ω(d)},h_n=mu^2(n) fn=σ(n2),gn=2ω(d),hn=μ2(n)
则有: f = g ∗ I , g = h ∗ I f=g*I,g=h*I f=gI,g=hI(由上面的式子写成狄利克雷卷积的形式),
则有: f = ( h ∗ I ) ∗ I = h ∗ ( I ∗ I ) = h ∗ σ f=(h*I)*I=h*(I*I)=h*σ f=(hI)I=h(II)=hσ(狄利克雷卷积结合律),所以有:
∑ i = 1 n f i = ∑ i = 1 n ( h ∗ σ ) ( i ) = ∑ i j ≤ n h i σ j = ∑ i = 1 n μ i 2 ∑ j = 1 ⌊ n i ⌋ σ j sum_{i=1}^{n}f_i=sum_{i=1}^{n}(h*σ)(i)=sum_{ij≤n}h_iσ_j=sum_{i=1}^{n}mu^2_isum_{j=1}^{lfloor frac{n}{i}rfloor}σ_j i=1nfi=i=1n(hσ)(i)=ijnhiσj=i=1nμi2j=1inσj
显然我们就需要算出 μ 2 , σ mu^2,σ μ2,σ的前缀和。
∑ i = 1 n σ n = ∑ i = 1 n ⌊ n i ⌋ sum_{i=1}^nσ_n=sum_{i=1}^{n}lfloor frac{n}{i}rfloor i=1nσn=i=1nin
那么 ∑ i = 1 n μ i 2 sum_{i=1}^{n}mu_i^2 i=1nμi2的求法就是 [ 1 , n ] [1,n] [1,n]中无平方约数的个数和。
证明就是 μ mu μ函数的性质:一个数 x x x为完全平方数的整数倍时, μ x = 0 mu_x=0 μx=0;否则 μ x = ± 1 , μ x 2 = 1 mu_x=±1,mu_x^2=1 μx=±1,μx2=1,所以得证。
考虑容斥原理,就有 ∑ i = 1 n μ i 2 = ∑ i = 1 n μ i ⌊ n i 2 ⌋ sum_{i=1}^{n}mu_i^2=sum_{i=1}^{sqrt{n}}mu_ilfloorfrac{n}{i^2}rfloor i=1nμi2=i=1n μii2n
等用于:完全平方数。
套在一起用整除分块即可。

代码:

goto

最后

以上就是强健黑裤为你收集整理的luogu SP20173 DIVCNT2 - Counting Divisors (square)背景:题目传送门:题意:思路:代码:的全部内容,希望文章能够帮你解决luogu SP20173 DIVCNT2 - Counting Divisors (square)背景:题目传送门:题意:思路:代码:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部