[數論] 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;
}


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