HDU3501

结论题:小于n的所有互质数之和为phi(n)*n/2

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+11;
typedef long long ll;
ll euler(int n){
    ll ans=n;
    for(ll i = 2; i*i <= n; i++){
        if(n%i==0){
            ans=ans/i*(i-1);
            while(n%i==0) n/=i;
        }
    }
    if(n>1) ans=ans/n*(n-1);//note
    return ans;
}
int main(){
    ll t;
    while(scanf("%d",&t)!=EOF){
        if(t==0)break;
        printf("%lld\n",(t*(t-1)/2-euler(t)*t/2)%1000000007);
    }
    return 0;
}
posted @ 2018-01-10 16:33  Caturra  阅读(114)  评论(0)    收藏  举报