SDOI真有人性,出这么欢乐题 –root
枚举$n$的约数$k$,令$s(k)$为满足$gcd(m,n)=k,(1{\leq}m{\leq}n)m$的个数,则$ans=\sum_{n\ mod\ k=0}(k*s(k))$
${\because}\ gcd(m,n)=k$
${\therefore}\ gcd(\frac{m}{k},\frac{n}{k})=1$
${\therefore}\ s(k)=\varphi(\frac{n}{k})$
其实主要在于如何$O(\sqrt{n})$的复杂度求单个$\varphi(x)$ 步骤如下:
将$\varphi$赋为$x$,表示当前与$x$互质的数有$x$个
找到一个$x$的约数$k$
找到了约数,那么和$x$互质的数就又少了$\frac{\varphi}{k}$个,$\varphi=\varphi*\frac{k-1}{k}$
将这个约数从$x$中全都除掉
重复以上步骤直到找不到$x$的约数
最后如果$x$是质数还要特判一下
返回$\varphi$的值
1 | program bzoj_2705; |