Refer
主要思路参考了 Command_block 的题解。
Description
给定 (n)((nle 10^{10})),求
[sum_{i=1}^nsigma_0(i^2) mod 2^{64}
]
Solution
首先有一个惯例套路:
[sigma_0(icdot j)=sum_{x|i}sum_{y|j}left[gcd(x,y)=1
ight]
]
在 [SDOI2015]约数个数和 以及 BZOJ4176 Lucas的数论 中,我们将这个式子继续化成如下模样,就可以做了:
[sigma_0(icdot j)=sum_{t|i,t|j}mu(t)cdot dleft(frac{i}{t}
ight)cdot dleft(frac{j}{t}
ight)
]
最后的结果长这样:(然后就可以杜教筛了)
[sum_{i=1}^nsum_{j=1}^nd(icdot j)=sum_{t=1}^nmu(t)cdotleft(sum_{i=1}^{left[frac{n}{t}
ight]}d(i)
ight)^2
]
但是这题的这样算结果长这样:
[sum_{i=1}^nd(i^2)=sum_{t=1}^nmu(t)cdotleft(sum_{i=1}^{left[frac{n}{t}
ight]}d(i)^2
ight)
]
这就不太能做。可见,思维僵化的推导方法有时根本行不通。考虑不反演,直接先枚举 (x)、(y)。
[sum_{i=1}^nsigma_0(i)=sum_{i=1}^nsum_{x|i}sum_{y|i}left[gcd(x,y)=1
ight]=sum_{x=1}^nsum_{y=1}^n[gcd(x,y)=1]cdot left(sum_t[x|t,y|t,tle n]
ight)
]
因为 (x)、(y) 互质,所以 (sum[x|t,y|t,tle n]=left[frac{n}{xy} ight]),这就是个比较简洁的式子了:
[sum_{i=1}^nsigma_0(i)=sum_{x=1}^nsum_{y=1}^n[gcd(x,y)=1]cdotleft[frac{n}{xy}
ight]
]
这时摆在我们面前的最常见的做法是把 (gcd(x,y)=1) 拆开来,但是这回,常见的套路并没有成功。我们需要的是一种全新的方法——构造另一个函数并使用反演公式。设:
[f(n,t)=sum_{x=1}^nsum_{y=1}^n[gcd(x,y)=t]cdotleft[frac{n}{xy}
ight]
]
[F(n,t)=sum_{x=1}^nsum_{y=1}^n[t|gcd(x,y)]cdotleft[frac{n}{xy}
ight]
]
于是得到:
[F(n,t)=sum_{k=1}^{+infty}f(n,kt) Rightarrow f(n,t)=sum_{k=1}^{+infty}mu(k)cdot f(n,kt)
]
我们要求的答案是 (f(n,1))。考虑怎么推这个 (F),接下来按套路走就可以辣:
[F(n,t)=sum_{T=1}^n left[frac{n}{T}
ight]sum_{x|T}left[t|gcd(T,frac{T}x)
ight]
]
仔细看就可以发现 (t|x,t^2|T),可以得到:
[F(n,t)=sum_{T=1}^{left[frac{n}{t^2}
ight]}left[frac{n}{Tt^2}
ight]cdot d(T)
]
总的式子就是:
[sum_{i=1}^nsigma_0(i)=sum_{t=1}^{sqrt n}mu(t)sum_{T=1}^{left[frac{n}{t^2}
ight]}left[frac{n}{Tt^2}
ight]cdot d(T)
]
(d) 的前缀和可以用类似杜教筛的方法得到,前面的部分,假设第二个求和它是除以 (t) (往大了放缩) 的时候复杂度可以分析出是和杜教筛一样的,于是总复杂度就是 (O(n^{frac{2}{3}}))。
Code
在 vjudge 上交过了,洛谷还在 Waiting。