题意
传送门 HDU 3501
题解
求小于 N N N 且与 N N N 不互素的正整数之和,考虑小于 N N N 的正整数之和减去小于 N N N 且与 N N N 互素的正整数之和。根据更相减损术,若 g c d ( N , x ) = 1 gcd(N,x)=1 gcd(N,x)=1,则有 g c d ( N , N − x ) gcd(N,N-x) gcd(N,N−x)=1,那么考虑成对的与 N N N 互素的数,则答案为 ( N − 1 ) × N / 2 − e u l e r ( N ) ∗ N / 2 (N-1)\times N/2 - euler(N)*N/2 (N−1)×N/2−euler(N)∗N/2。
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int mod = 1000000007;
int N;
int euler_phi(int n)
{
int res = n;
for (int i = 2; i * i <= n; ++i)
{
if (n % i == 0)
{
res = res / i * (i - 1);
while (n % i == 0)
n /= i;
}
}
if (n != 1)
res = res / n * (n - 1);
return res;
}
int main()
{
while (~scanf("%d", &N) && N)
{
ll res = 1LL * N * (N - 1) / 2;
res -= 1LL * euler_phi(N) * N / 2;
printf("%lld\n", (res % mod + mod) % mod);
}
return 0;
}