数学题---与n互质数字之和

给出一个n,求1…n中与n互质的数的和
公式为
r e s = n ∗ p h i ( n ) / 2 res = n*phi(n)/2 res=nphi(n)/2
phi为欧拉函数

#include
#include
#include
#include
#include
using namespace std;
#define int long long
const int mod = 1000000007;
int qmi(int a,int b){int res=1;while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}return res%mod;}
int phi(int x){
    int res=x;
    for(int i=2;i<=x/i;i++){
        if(x%i==0){
            res=res/i*(i-1);
            while(x%i==0)x/=i;
        }
    }
    if(x>1)res=res/x*(x-1);
    return res%mod;
}

int Mod(int x)
{
    return ((x%mod)+mod)%mod;
}

signed main()
{
    int n;
    while(cin>>n)
    {
        int s=Mod(Mod(n)*Mod(n+1));
        s=Mod(s*qmi(2,mod-2));
        int t=Mod(Mod(n)*Mod(phi(n)));
        t=Mod(t*qmi(2,mod-2));
        cout<<Mod(s-t)<<'\n';
    }
}

你可能感兴趣的:(数学,算法)