求出N内所有与N互质的数字之和
我们利用欧拉函数和欧几里德定理,if gcd(n,i)==1 ,则有 gcd(n,n-i)==1 ,可以知道 其中一个若为i则存在一个为n-i 那么二者之和为n ,这样的一共有eular(n)/2对 故与n互质的所有数的和为 n*eular(n)/2 那么与n不互质的 数就是(n)*(n-1)/2-n*eular(n)/2
其实还没怎么理解,当公式记住了
#include <iostream>
using namespace std;
#define m 1000000007
long long int oular(long long int n)
{
long long int ans=n;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
ans=ans-ans/i;
while(n%i==0)
n=n/i;
}
}
if(n!=1)
ans=ans-ans/n;
return ans;
}
int main()
{
long long int N;
while(scanf("%lld",&N)&&N!=0)
{
N=(N*(N-1)/2-N*oular(N)/2)%m;
cout << N<<endl;
}
return 0;
}