HDU 3501 Calculation 2

给定正整数 \(n\) ,求小于 \(n\) 且不与 \(n\) 互质的正整数的和,若 \(a,b\) 不互质,那么 \(\gcd(a,b) \ne 1\)


前置芝士

\(\gcd(a,n)=1\) ,那么 \(\gcd(n-a,n)=1\)\((a<n)\)

反证法:
假设 \(\gcd(a,n)=1\) , \(\gcd(n-a,n)=k\) , \(k\ne 1\)

那么就有 \(n-a=A\times k\) , \(n=B \times k\)

\(n-(n-a)=B\times k-A\times k\)

\(a=(B-A)\times k\) , \(n=B\times k\)

所以 \(\gcd(a,n)\) 至少为 \(k\)\(k\ne 1\) ,矛盾!

所以原命题成立

开始做题

先把互质的数的和求出来

扫描二维码关注公众号,回复: 9157809 查看本文章

说到互质,握么就想到了欧拉函数

\(\varphi(n)=m\)

那么把这些互质的数列出来

\(a_1,a_2,\cdots,a_m\)

我们发现

\(n-a_1,n-a_2,\cdots,n-a_m\) 这些数也恰好与 \(n\) 互质,并且刚好是对应的,即 \(a_i=n-a_{m-i+1}\)

然后把上下一加,就变成了

\(n,n,\cdots,n=m \times n = \varphi(n)\times n\)

因为每个 \(a_i\) 都被算了 2 次 ,所以还要除以 2

所以
\[ \sum_{gcd(d,n)=1}d=\frac {\varphi(n)\times n}{2} \]
然后就可以做了

时间复杂度 \(O(\sqrt n)\)

// This code wrote by chtholly_micromaker(MicroMaker)
#include <bits/stdc++.h>
#define reg register
#define int long long
using namespace std;
const int p=1e9+7;
template <class t> inline void read(t &s)
{
    s=0;
    reg int f=1;
    reg char c=getchar();
    while(!isdigit(c))
    {
        if(c=='-')
            f=-1;
        c=getchar();
    }
    while(isdigit(c))
        s=(s<<3)+(s<<1)+(c^48),c=getchar();
    s*=f;
    return;
}
int n;
inline int eular(int x)
{
    reg int ans=x;
    reg int maxi=sqrt(x);
    for(int i=2;i<=maxi;++i)
        if(!(x%i))
        {
            ans-=ans/i;
            while(!(x%i))
                x/=i;
        }
    if(x>1)
        ans-=ans/x;
    return ans;
}
inline void work()
{
    int phin=eular(n);
    reg int ans=n*(n-1)/2;ans%=p;
    phin=n*phin/2;phin%=p;
    // printf("info %lld %lld\n",ans,phin);
    printf("%lld\n",((ans-phin)%p+p)%p);
    return;
}
signed main(void)
{
    while(cin>>n&&n)
        work();
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/chinesepikaync/p/12309985.html