HDOJ 3501 Calculation 2 (欧拉函数)

Calculation 2

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


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 题意:求小于n且与n互质的数的和 思路:欧拉函数,和n互素的之和为:n*eular(n)/2,然后前n项和减一下就行了。 ac代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#define MAXN 100100
#define MOD 1000000007
#define LL long long
#define INF 0xfffffff
using namespace std;
LL eular(LL n)
{  
    LL i,res=n;  
    for(i=2;i*i<=n;i++)  
        if(n%i==0)
		{  
            res=res/i*(i-1);  
            while(n%i==0)
			n/=i;  
        }  
    if(n>1) 
	res=res/n*(n-1);  
    return res;  
}
int main()
{
    LL n;
	while(scanf("%lld",&n)!=EOF,n)
	{
		LL ans=((n*(n-1)/2)-((n*eular(n)/2)))%MOD;
		printf("%lld\n",ans);
	} 
    return 0;
}


你可能感兴趣的:(HDOJ 3501 Calculation 2 (欧拉函数))