其他分享
首页 > 其他分享> > [SDOI2012] Longge 的问题

[SDOI2012] Longge 的问题

作者:互联网

题意

在这里插入图片描述

解析

首先设 g c d ( i , n ) = t gcd(i,n)=t gcd(i,n)=t,答案就是 t t t的累加, t t t一定是 n n n的因子,所以考虑枚举 n n n的所有因子 t t t, g c d ( i , n ) = t = = > g c d ( i / t , n / t ) gcd(i,n)=t ==> gcd(i/t,n/t) gcd(i,n)=t==>gcd(i/t,n/t) 所以 gcd ⁡ ( i , n ) \gcd(i,n) gcd(i,n)的个数就是 ϕ ( n / t ) \phi(n/t) ϕ(n/t),对答案的贡献值就是 ϕ ( n / t ) ∗ t \phi(n/t)*t ϕ(n/t)∗t

求因子的时候需要利用对称的特点,可以把时间复杂度降低到 O ( n ) O(\sqrt{n}) O(n ​)

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll get(ll x ){
    ll res=x;
    for(int i=2;i<=x/i;i++){
        if(x%i==0)res=res/i*(i-1);
        while(x%i==0)x/=i;
    }
    if(x>1)res=res/x*(x-1);
    return res;
}
int main(){
    ll n;
    cin>>n;
    ll res=0;    
    for(int i=1;1ll*i*i<=n;i++){
        if(n%i==0){
            res+=get(n/i)*i;
            if(n/i!=i){
                res+=get(i)*(n/i);
            }
        }
    }
    cout<<res;
}

标签:gcd,Longge,res,ll,因子,long,问题,int,SDOI2012
来源: https://blog.csdn.net/TKKDOUZI/article/details/120163706