hdoj 3501 -Calculation 2 (欧拉函数)

Calculation 2

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3305    Accepted Submission(s): 1367


Problem Description
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
 
Author
GTmac
 
Source
 
Recommend
zhouzeyong   |   We have carefully selected several similar problems for you:  3507 3506 3505 3504 3499 
<= n中与n 互质数的和 phi[a]*a/2;
#include <cstdio>
#define MOD 1000000007
typedef long long LL;
LL euler(LL n)
{
    LL i; 
    LL eu= n;
    for(int i=2; i*i <= n; i++)
    {
        if(n%i ==0)
        {
            eu= eu*(i-1) /i;
            while(n %i==0)
                n/= i;
        }
    }
    if(n >1) eu= eu* (n-1) /n;
    return eu;
}
int main()
{
    LL n;
    while(scanf("%lld", &n), n)
    {
        LL ans= n&1? (n+1)/2*n : n/2*(n+1);
        ans= ans- euler(n) *n/2;
        printf("%lld
", (ans-n)%MOD);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/soTired/p/5399683.html