[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;
}
上一篇:CF703E Mishka and Divisors 题解


下一篇:UVa 12716 GCD XOR (数论+bitmask)