求不大于n(1<=n<=10000)且与n互质的正整数的个数
#include <cstdio>
#include <cstring>
const int maxn = 10010;
int n, cnt;
int c[maxn], ys[maxn];
bool p[maxn];
int prime[maxn];
void f()
{
// get primes
memset(p, true, sizeof(p));
for (int i = 2; i * i < maxn; ++i)
{
for (int j = i * 2; j < maxn; j += i)
p[j] = false;
}
int num = 0;
for (int i = 2; i < maxn; ++i)
if (p[i]) prime[num++] = i;
}
int main()
{
scanf("%d", &n);
memset(c, 0, sizeof(c));
int m = n, i = 0;
f();
int num = 0;
for (int i = 0; prime[i] <= m; ++i)
{
// get divisors of n
if (m % prime[i] == 0)
{
while (m % prime[i] == 0)
{
m /= prime[i];
}
ys[num++] = prime[i];
}
}
for (int i = 0; i < num; ++i)
{
for (int j = i; j <= n; j += ys[i])
c[j] = 1;
}
int cnt = n;
for (int i = 1; i <= n; ++i)
cnt -= c[i];
printf("%d\n", cnt);
return 0;
}