杭电3501 Calculation 2(欧拉函数)

版权声明:ACM代码随意转载。算法描述需备注来源。谢谢合作。 https://blog.csdn.net/Sensente/article/details/89505147

杭电3501 http://acm.hdu.edu.cn/showproblem.php?pid=3501

题目大意:求1~N中与N互质的数之和与1~N之和的差值。

欧拉公式拓展: 

欧拉公式: 

(性质4)

AC代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
//#define DEBUG
using namespace std;
typedef long long ll;
const ll MOD = 1000000007;
ll euler(ll n) { //欧拉公式
    ll ans=n;
    for(int 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);
    return ans;

}
int main() {
    ll n=0;
    while(cin>>n) {
        if(n==0) return 0;
        cout<<((n*(n-1)/2) - n*euler(n)/2)%MOD<<endl; //该题可以不分步取模
    }


    return 0;
}

猜你喜欢

转载自blog.csdn.net/Sensente/article/details/89505147