【题解】P2303 [SDOi2012]Longge的问题

\(Description:\)

求出\(\sum_{i=1}^{n}gcd(i,n)\)的值

\(Sample\) \(Input:\)

6

\(Sample\) \(Output:\)

15

\(Hint:\)

\(n<={MAX}{INT}\)

哇塞,这题数据范围真棒!

考虑要么是sqrt,要么log

看gcd这个样子多半不会是log

但是不能臆断!考虑对这个式子进行gcd化简

设d为\(gcd(i,n)\)

\(gcd(i/d,n/d)=1\),发现这好像说明d是n的约数?

废话

那么考虑每一个n的约数d对答案的贡献:

\(x\)为与\(n/d\)互质的数的个数,那么就是\(d*x\)

因为总共会有x次gcd的值为d

那么只要\(\sqrt{n}\)枚举约数,在每个约数求\(\phi\)就可以了

复杂度不会证。。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,cnt,ans;
inline int phi(int x){
    int ret=x;
    for(int i=2;i*i<=x;++i){
        if(x%i==0){
            ret=ret/i*(i-1);
            while(x%i==0) x/=i;
        }
    }
    if(x>1) ret=ret/x*(x-1);
    return ret;
}
inline void divide(int x){
    for(int i=1;i*i<=x;++i){
        if(x%i==0){
            ans+=phi(n/i)*i;
            if(i*i!=x) ans+=phi(i)*(n/i);
        }
    }
}
signed main(){
    scanf("%lld",&n);
    divide(n);
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/JCNL666/p/10680198.html