P2303 [SDOi2012]Longge的问题

题目背景

SDOi2012

题目描述

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

输入输出格式

输入格式:

 

一个整数,为N。

 

输出格式:

 

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

 

输入输出样例

输入样例#1: 复制
6
输出样例#1: 复制
15

说明

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

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

 

//Pro:P2303 [SDOi2012]Longge的问题

//仍然是考虑让gcd(i,n)=d
//那么gcd(i/d,n/d)=1
//所以gcd(i,n)=d的i的个数就有phi(n/d)个
//但是n<=2^32,开不下数组,所以要一个数一个数算
//ans+=phi(n/d)*d+phi(d)*(n/d)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

long long n;

long long getphi(long long x)
{
    long long res=x,tmp=x,i=2;
    for(;i*i<=x;++i)
    {
        if(tmp%i)
            continue;
        res-=res/i;
        while(tmp%i==0)
            tmp/=i;
    }
    if(tmp>1)
        res-=res/tmp;
    return res;
}

long long ans;
int main()
{
    scanf("%lld",&n);
    long long g=sqrt(n);
    for(long long i=1,d;i<=g;++i)
    {
        if(n%i==0)
        {
            d=n/i;
            ans+=getphi(d)*i+getphi(i)*d;
        }
    }
    if(g*g==n)
        ans-=getphi(g)*g;
    printf("%lld",ans);
    return 0;
}
posted @ 2018-09-12 10:53  whymhe  阅读(171)  评论(0编辑  收藏  举报