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