[欧拉函数]51nod 1040 最大公约数之和 题解

(传送门)

题目大意

ni=1 gcd(i,n)

解题分析

注意,所有gcd(x,n)最后都是n的因数。所以可以对因数分类,设 f(i) gcd(x,n)==ii<n 的正整数x,则

ans= if[i]|in

如果 gcd(x,n)=i ,则 gcd(x/i,n/i)=1 ,gcd()=1就想到了欧拉函数,所以最后 f[i]=φ(n/i)

复杂度:
时间: O(n)
空间: O(1)

#include<cmath>
#include<cstdio>
#define LL long long
using namespace std;
int n,S,p[10005];
LL ans;
int getp(int x){
    int sum=x; for (int i=2,S=sqrt(x);i<=S;i++) if (x%i==0) {sum=sum/i*(i-1); while (x%i==0) x/=i;}
    if (x>1) sum=sum/x*(x-1); return sum;
}
int main()
{
    freopen("gcda.in","r",stdin);
    freopen("gcda.out","w",stdout);
    scanf("%d",&n); S=sqrt(n); ans=0;
    for (int i=1;i<=S;i++)
        if (n%i==0){
            int t=n/i;ans+=(LL)i*getp(t);
            if (i!=t) ans+=(LL)t*getp(i);
        }
    printf("%lld",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/try__jhf/article/details/78378655