给定正整数 \(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;
}