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;}