题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3501
相关知识:
求小于
n
n
n且与
n
n
n互质的数的和
若
g
c
d
(
i
,
n
)
=
=
1
gcd(i,n)==1
gcd(i,n)==1,则有
g
c
d
(
n
−
i
,
n
)
=
=
1
gcd(n-i,n)==1
gcd(n−i,n)==1。
于是在小于
n
n
n且与
n
n
n互质的数中,
i
i
i与
n
−
i
n-i
n−i总是成对出现的,且相加等于
n
n
n。
那么考虑
i
=
n
−
i
i=n-i
i=n−i的特殊情况,此时
n
=
2
∗
i
n=2*i
n=2∗i,由
g
c
d
(
i
,
n
)
=
=
1
gcd(i,n)==1
gcd(i,n)==1,得
n
=
2
n=2
n=2。此时计算可知:
a
n
s
=
1
ans=1
ans=1。
因为小于且与互质的数的个数为
φ
(
n
)
φ(n)
φ(n),于是可以得出计算公式
a
n
s
=
n
∗
φ
(
n
)
2
ans=\frac {n*φ(n)}{2}
ans=2n∗φ(n)。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const ll mod=1e9+7;
ll eulr(ll n)//模板
{
ll ans=n;
ll tmp=sqrt(n);
for(ll i=2;i<tmp+1;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;
while(cin>>n&&n){
ll ans=(n-1)*n/2;
ans=(ans-n*eulr(n)/2)%mod;
cout<<ans<<endl;
}
return 0;
}