题目概述
求 ∑ni=1(i,n) 。
解题报告
∑i=1n(i,n)=∑d|nd∑i=1nd[(i,nd)=1]=∑d|ndφ(nd)
然后暴枚因子求欧拉函数就可以了,效率不知道怎么证明,反正可以秒过:P。
示例程序
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long LL;
LL n,ans;
inline LL phi(LL n)
{
LL ans=n;
for (int i=2,S=sqrt(n);n>1&&i<=S;i++)
if (!(n%i)) {ans=ans/i*(i-1);while (!(n%i)) n/=i;}
if (n>1) ans=ans/n*(n-1);return ans;
}
int main()
{
freopen("program.in","r",stdin);
freopen("program.out","w",stdout);
scanf("%lld",&n);ans=0;
for (int i=1,S=sqrt(n);i<=S;i++)
if (!(n%i)) {ans+=phi(n/i)*i;if (n/i>S) ans+=phi(i)*n/i;}
return printf("%lld\n",ans),0;
}