水平较水,想不到,看的讨论版
与n的公约数,肯定是n的因子
那我们枚举n的因子就好了
假设因子为x,那么x的贡献次数就是1-n有多少个数与n的gcd=x,即1-n/x有多少个数与n/x互质,即phi(n/x)
#include <bits/stdc++.h>
typedef long long LL;
LL getEuler(LL num)
{
LL res = num;
for(int i = 2; i*i <= num; ++i)
{
if(num%i == 0)
{
res -= res/i;
while(num%i == 0)
num /= i;
}
}
if(num > 1) res -= res/num;
return res;
}
int main()
{
int n;
LL res = 0;
scanf("%d",&n);
for(int i = 1; i*i <= n; ++i)
{
if(n%i == 0)
{
if(i*i == n)
res += getEuler(i)*i;
else
res += getEuler(n/i)*i + getEuler(i)*(n/i);
}
}
printf("%lld\n",res);
return 0;
}
本文介绍了一种计算与给定整数n的所有公约数的方法。通过枚举n的因子并利用欧拉函数phi(n/x),计算每个因子x对最终结果的贡献次数。
4万+

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



