hdu3501 Calculation 2 欧拉函数

//求小于n且和n不互质的所有数之和
//若gcd(n , i) == 1 那么 gcd(n , n-i) == 1
//可以用反证法
//设gcd(n , n-i) != 1;
//那么可以有 n = k1*a
//n - i = k2*a ;
//i = (k1-k2)*a 
//gcd(n ,i) != 1
//那么 ans = n*(n-1)/2 - n*euler(n)/2 
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
typedef __int64 ll ;
const int mod = 1000000007 ;
ll Euler(ll  n)
{
    ll res = n ;
    for(ll i = 2;i*i <= n;i++)
    {
        if(n%i == 0)
        res -= res/i ;
        while(n%i == 0)
        n/=i ;
    }
    if(n > 1)res -= res/n ;
    return res ;
}
int main()
{
    ll n ;
    while(scanf("%I64d" , &n) && n)
    {
        ll  sum = Euler(n) ;
        //cout<<sum<<endl;
        ll ans = (((n)*(n-1)/2) - n*sum/2)%mod ;
        printf("%I64d\n" , ans) ;
    }
    return  0 ;
}

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