题意简述
T组数据。每次给定n,求$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\phi(gcd(i,j))$
n<=10^7,T<=5000。 (用T根号n的算法就能过了)
思路框架
把gcd换掉,然后用[SDOI2008]仪仗队(洛谷 bzoj)的做法,每次根号(n)求出来
具体思路
把$gcd$换掉,式子变成
$\sum\limits_{g=1}^n\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n} [gcd(i,j)==g] \phi(g)$
$\phi(g)$提前,变成
$\sum\limits_{g=1}^n \phi(g) \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n} [gcd(i,j)==g]$
后面那个式子化一下,变成枚举$i,j$的倍数:
$\sum\limits_{g=1}^n \phi(g) \sum\limits_{i=1}^{n/g}\sum\limits_{j=1}^{n/g} [gcd(i,j)==1]$
然后,后面的式子就变成了仪仗队那题的式子了。也就是,我们要求:
$\sum\limits_{i=1}^{x}\sum\limits_{j=1}^{x} [gcd(i,j)==1]$。由于前面$g$要整除分块,带一个根号,所以这个地方就要用一个$O(1)$的算法求。
仪仗队那题的O(1)做法
由于$gcd(i,j)$是对称的,所以我们考虑把它变成这样:
$2\times \sum\limits_{i=1}^{x}\sum\limits_{j=1}^{i} [gcd(i,j)==1]-\sum\limits_{i=1}^{x} [gcd(i,i)==1]$。
我们设$\phi’(i)=\phi(1…i)$的和。(即:求$\phi$的前缀和)
那么该式等于$2\phi’(i)-1$。
得解
回到原问题。上回说到,式子变成了$\sum\limits_{g=1}^n \phi(g) \sum\limits_{i=1}^{n/g}\sum\limits_{j=1}^{n/g} [gcd(i,j)==1]$。
套用仪仗队那题的式子,变成:
$\sum\limits_{g=1}^{n} \phi(g)\times(2\phi’(n/g)-1)$
后面的$n/g$珂以整除分块做。总体复杂度就是$O(1e7+T\times\sqrt{n})=O(AC)$。
WARNING
只有phi的前缀和以及答案需要开long long ,其它int就够了。防止MLE。
代码
1 |
|