HDU 3501 Calculation 2
- 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.
Ouput
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互质的数的总和为:φ(x) * x / 2。(n>1) 所以:res = n*(n-1)/2-n - phi[x]*x/2
- 代码如下:
#include <iostream>
using namespace std;
typedef long long ll;
const int mod=1000000007;
int euler1(int n)
{
int rea=n,sum=0;
for(int i=2; i*i<=n; i++)
if(n%i==0)
{
rea=rea-rea/i;
do
n/=i;
while(n%i==0);
}
if(n>1)
rea=rea-rea/n;
return rea;
}
int main()
{
ll n;
while(cin>>n,n){
ll s=(ll(n*(n-1)/2)%mod-ll(n*euler1(n)/2)%mod+mod)%mod;
cout<<s<<endl;
}
return 0;
}