您的位置:首页 > 大数据 > 人工智能

HDU1787 GCD Again(容斥原理)

2014-03-09 21:52 232 查看
和1695类似的题目,只不过这次求的是不互质数的个数.

#include <iostream>
#include <memory.h>
#include <cstdio>
#include <vector>
using namespace std;

const int MAX = 1000005;
bool is_prime[MAX];
int prime[MAX / 10], prime_idx;
void init_prime(){
memset(is_prime + 2, true, sizeof(is_prime));
for (int i = 2; i < MAX; ++i){
if(is_prime[i]){
prime[prime_idx++] = i;
for(int j = i + i; j < MAX; j += i){
is_prime[j] = false;
}
}
}
}

int inclusion_exlusion(int r, int n){
int res = 0, tn = n;
vector<int> p;
for(int i = 0; i < prime_idx && prime[i] < tn; ++i){
if(tn % prime[i] == 0){
p.push_back(prime[i]);
while(tn % prime[i] == 0){
tn /= prime[i];
}
}
}
if(tn > 1){
p.push_back(tn);
}

for(int i = 1; i < (1 << p.size()); ++i){
int bits = 0, multiple = 1;
for(int j = 0; j < p.size(); ++j){
if(i & (1 << j)){
bits++;
multiple *= p[j];
}
}
if(bits & 1)res += r / multiple;
else res -= r / multiple;
}
return res;
}

int main(int argc, char const *argv[]){
init_prime();
int n;
while(scanf("%d", &n) && n){
printf("%d\n", inclusion_exlusion(n - 1, n));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: