bzoj2705

参考:http://blog.csdn.net/popoqqq/article/details/39119649

就是求欧拉函数,注意求1的欧拉函数时,这个题中需要时1,即(1,1)互素。

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

long long int fef(long long int x){
    if(x==1){
        return 1;
    }
    else{
        long long int ans=1;

        for(long long int i=2;i*i<=x;i++){
            long long int temp=1;

            while(x%i==0){
                x=x/i;
                temp=temp*i;
            }
            if(temp==1){
                continue;
            }
            else{
                ans=ans*(temp-temp/i);
            }
        }
        if(x!=1){//注意这里,不能忘记情况,出循环后x有可能不是1,否则会错。
            ans=ans*(x-1);
        }

        return ans;
    }
}

int main(){
    long long int n;
    long long int ans=0;

    scanf("%lld",&n);
    for(long long int i=1;i*i<=n;i++){
        if(n%i==0){
            ans+=fef(n/i)*i;//当n/i==1的时候,与1互素的包括(1,1)
            if(i*i!=n){
                ans+=fef(i)*(n/i);
            }
        }
    }

    printf("%lld\n",ans);
}


posted @ 2015-10-05 09:28  buzhidaohahaha  阅读(138)  评论(0编辑  收藏  举报