您的位置:首页 > 其它

[数论] HOJ 2947 Calculation 2 欧拉函数

2014-02-10 13:19 387 查看
传送门:Calculation 2


Calculation 2

My Tags  (Edit)
 Source : GTmac
 Time limit : 1 sec Memory limit : 64 M
Submitted : 221, Accepted : 94

Background

Given a positive integer N, your task is to calculate the sum of the positive integers less than N which are not coprime to N. A is said to be coprime to B if A, B share no common positive divisors except 1.

Input

For each test case, there is a line containing a positive integer N(1 ≤ N ≤ 1000000000). A line containing a single 0 follows the last test case.

Output

For each test case, you should print the sum module 1000000007 in a line.

Sample Input

3
4
0


Sample Output

0
2


解题报告:

题意是求和n不互质的数的总和。可用总和1-(n-1)减去互质的数的总和。课用欧拉函数求1-n的互质的数的个数num。

则若a和n互质,n-a必定也和n互质(a<n)。也就是说num必定为偶数。其中互质的数成对存在。其和为n。则总和为num*n/2

代码如下:

#include <stdio.h>
long long eular(long long n){
long long ret=1,i;
for(i=2;i*i<=n;i++)
if (n%i==0){
n/=i,ret*=i-1;
while (n%i==0)
n/=i,ret*=i;
}
if (n>1)
ret*=n-1;
return ret; //n的欧拉数
}
int main(){
long long n;
while(scanf("%lld",&n)==1&&n){
long long sum=n*(n+1)/2-n;
sum-=eular(n)*n/2;
printf("%lld\n",sum%1000000007);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数论 欧拉函数