hdoj3501Calculation 2【欧拉函数】

来源:互联网 发布:无绳跳绳 知乎 编辑:程序博客网 时间:2024/05/19 14:54

 


Calculation 2

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


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
340
 

Sample Output
02
 

题意求与N不互质的数的和;

欧拉函数性质;与N互质的数的和为N*eular(N)/2;1~N的总和为N*(N-1)/2

#include<cstdio>#include<cstdlib>#include<cstring>#define MOD 1000000007using namespace std;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;}int main(){long long n;while(scanf("%lld",&n),n){long long ans=n*(n-1)/2;printf("%lld\n",(ans-n*Eular(n)/2)%MOD);}return 0;}
0 0