BZOJ2705:[SDOI2012]Longge的问题——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=2705

Description

Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。

Input

一个整数,为N。

Output

一个整数,为所求的答案。

Sample Input

6

Sample Output

15

————————————————————————————————————————————

http://hzwer.com/3470.html的博客已经讲的蛮清楚了,这里在复述一遍。

gcd(i,n)的值显然是n的约数,这里取k=gcd(i,n),满足该关系式的i的个数为s(k)。

则答案为k*s(k)(k|n)

又因为k=gcd(i,n)推出gcd(n/k,i/k)=1,设t=i/k,则n/k与t互质,求出t的个数。

这显然可以用欧拉函数解决,那么s(k)=phi(n/k)

 

#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll phi(ll x){
    ll res=x;
    for(ll i=2;i*i<=x;i++){
    if(x%i==0){
        res-=res/i;
        while(x%i==0)x/=i;
    }
    }
    if(x>1)res-=res/x;
    return res;
}
int main(){
    ll n;
    scanf("%lld",&n);
    ll ans=0;
    for(int i=1;i*i<=n;i++){
    if(n%i==0){
        ans+=(ll)i*phi(n/i);
        if(i*i<n)ans+=(ll)(n/i)*phi(i);
    }
    }
    printf("%lld\n",ans);
    return 0;
}

 

posted @ 2018-01-04 14:44  luyouqi233  阅读(187)  评论(0编辑  收藏  举报