首页 > 学院 > 开发设计 > 正文

GCD - Extreme (II) [欧拉函数]

2019-11-08 03:15:23
字体:
来源:转载
供稿:网友

这里写图片描述

G=0;for(i=1;i<N;i++) for(j=i+1;j<=N;j++) { G+=gcd(i,j); }/*Here gcd() is a function that findsthe greatest common divisor of the twoinput numbers*/

Input

The input file contains at most 100 lines of inputs. Each line contains an integer N (1 < N < 4000001). The meaning of N is given in the PRoblem statement. Input is terminated by a line containing a single zero.

Output

For each line of input produce one line of output. This line contains the value of G for the corresponding N. The value of G will fit in a 64-bit signed integer.

Sample Input

10 100 200000 0

Sample Output

67 13015 143295493160

题解

这里写图片描述

#include<stdio.h>#define MAX_N 4000002typedef long long LL;int phi[MAX_N];LL res[MAX_N],cum[MAX_N];void init(){ for(int i=1;i<MAX_N;i++) phi[i]=i; for(int i=2;i<MAX_N;i++) if(phi[i]==i) for(int j=i;j<MAX_N;j+=i) phi[j]=phi[j]/i*(i-1); for(int i=1;i<MAX_N;i++){ for(int k=i;k<MAX_N;k+=i){ res[k]+=1LL*i*phi[k/i]; } } for(int i=1;i<MAX_N;i++) res[i]-=i; for(int i=1;i<MAX_N;i++) cum[i]=cum[i-1]+res[i];}int main(){ init(); int n; while(scanf("%d",&n)&&n) printf("%lld/n",cum[n]); return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表