Longge的问题(bzoj 2705)

Description

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

Input

一个整数,为N。

Output

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

Sample Input

6

Sample Output

15

HINT

 

【数据范围】

对于60%的数据,0<N<=2^16。

对于100%的数据,0<N<=2^32。

/*
  想了很长时间,实在没想出怎么做。
  正解貌似很简单,设k=gcd(i,n),那么1=gcd(i/k,n/k),那么如果我们知道了K,可以用欧拉函数解出i的个数,把所有i的个数加起来就行了,
  至于枚举K,就是枚举n的因数。 
*/
#include<cstdio>
#include<iostream>
#define lon long long
using namespace std;
lon n,ans;
lon oula(lon x){
    lon res=x,a=x;
    for(lon i=2;i*i<=a;i++){
        if(a%i==0){
            res-=res/i;//res=res*(1-1/i)
            while(a%i==0) a/=i;
        }
    }
    if(a>1) res-=res/a;
    return res;
}
int main(){
    cin>>n;
    for(lon i=1;i*i<=n;i++){
        if(n%i) continue;
        ans+=oula(n/i)*i;
        if(i*i!=n) ans+=oula(i)*(n/i);
    }
    cout<<ans;
}

 

posted @ 2017-02-28 22:07  karles~  阅读(244)  评论(0编辑  收藏  举报