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

传送门: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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章