Calculation 2
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3729 Accepted Submission(s): 1564
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
题意 : 求1 ~ N 中与 N 不互质的数的总和
欧拉公式的引伸:小于或等于n的数中,与n互质的数的总和为:φ(x) * x / 2。(n>=1);
#include<cstdio>
typedef long long LL;
const LL mod = 1e9 + 7;
LL oula(LL x){
LL cut = x;
for(LL i = 2 ; i * i <= x; i++){
if(x % i == 0){
cut = cut / i * (i - 1);
while(x % i == 0)
x /= i;
}
}
if(x > 1)
cut = cut / x * (x - 1);
return cut;
}
int main()
{
LL N;
while(scanf("%lld",&N)!=EOF && N){
LL ans = (N * (N - 1) / 2 - oula(N) * N / 2) % mod;
printf("%lld\n",ans);
}
return 0;
}