nyoj-569

来源:互联网 发布:mac sublime 跳转 编辑:程序博客网 时间:2024/05/18 00:53

gcd(1,12)=1,gcd(5,12)=1,gcd(7,12)=1,gcd(11,12)=1,

gcd(2,12)=2,gcd(10,12)=2,

gcd(3,12)=3,gcd(9,12)=3,

gcd(4,12)=4,gcd(8,12)=4,

gcd(6,12)=6,

gcd(12,12)=12,

 

gcd(1,12)+gcd(2,12)+gcd(3,12)+gcd(4,12)+gcd(5,12)+gcd(6,12)+

gcd(7,12)+gcd(8,12)+gcd(9,12)+gcd(10,12)+gcd(11,12)+gcd(12,12)

=4*1+2*2+2*3+2*4+1*6+1*12=40

 

φ(12)*1+φ(6)*2+φ(4)*3+φ(3)*4+φ(2)*6+φ(1)*12

=4*1+2*2+2*3+2*4+1*6+1*12

=40 

#include<iostream>#include<cstdio>#include<cmath>using namespace std;long long phi(long long n){long long ans=n,i;for(i=2;i<=n;++i)if(n%i==0){while(n%i==0)n/=i;ans=ans/i*(i-1);//注意溢出,先除}return ans;}int main(){long long n,i,k,sum;//开大一点才能过while(scanf("%lld",&n)!=EOF){sum=0;for(i=1;i*i<=n;++i){if(i*i==n){sum+=phi(i)*i;break;}else if(n%i==0){k=n/i;sum+=phi(i)*k;sum+=phi(k)*i;}}printf("%lld\n",sum);}return 0;}

  题给标程(更简洁)

 #include<stdio.h>int Eular(int  n){     int i;     int  ans=n;     for(i=2;i*i<=n;++i){          if(n%i==0){      //如果i和n不互质,i的倍数全都与n不互质                ans-=ans/i;     //排除掉i的倍数                while(n%i==0)n=n/i;       //去掉n中含有的所有i因子                if(n==1)          // n=1 所有因子排除完毕break;          }     }     if(n!=1)        //n!=1  此时的n为素数 ans-=ans/n;     return ans;}int main(){    int i, j, k, n, x;    while( ~scanf("%d",&n) ){        long long sum = 0;        for(i=1;i*i<=n;i++){            if(i*i==n){                sum+=i*Eular(i);                break;            }            if(n%i==0){                sum+=( (long long)(i*Eular(n/i)));                sum+=( (long long)(n/i*Eular(i)));            }        }        printf("%lld\n",sum);    }    return 0;}