题目概述
求 ∑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;
}

本文介绍了一种利用数论中的欧拉函数求解特定数学问题的方法,并通过一个具体的数学题目展示了如何使用该方法进行高效计算。此外,还提供了一个C++示例程序来实现这一算法。
451

被折叠的 条评论
为什么被折叠?



