题意
问小于n的自然数中有多少个与n互质的数。
思路
显然是一个欧拉函数的定义题。
然而容斥原理也能做。
链接
http://poj.org/problem?id=2407
代码
#include<cstdio>
#include<iostream>
using namespace std;
long long n;
long long factor[1000], it;
void get_factor(long long n){
it = 0;
for(long long i = 2; i <= n / i; ++i){
if(n % i == 0){
factor[it++] = i;
while(n % i == 0) n /= i;
}
}
if(n != 1){
factor[it++] = n;
}
}
int gcd(int a, int b){
if(b == 0) return a;
return gcd(b, a % b);
}
long long lcm(long long a, long long b){
return a * b / gcd(a, b);
}
int main(){
while(scanf("%d", &n) == 1 && n){
get_factor(n);
//容斥原理
long long res = 0;
for(long long i = 1; i < (1 << it); ++i){
long long d = 1, cnt = 0;
for(long long j = 0; j < it; ++j){
if((i >> j) & 1){
d = lcm(d, factor[j]);
if(d > n) break;
++cnt;
}
}
if(d > n) continue;
if(cnt & 1) res += n / d;
else res -= n / d;
}
cout << n - res << endl;
}
return 0;
}