多功能欧拉筛

用欧拉筛三合一

v[i] 表示 i 的最小质因子
f[i] 表示 i 是不是质数
prime[i] 表示 第 i 个质数
phi[i] 表示 i 的欧拉函数值

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 10000005;
int init() {
	int rv = 0, fh = 1;
	char c = getchar();
	while(c < '0' ||c > '9') {
		if(c == '-') fh = -1;
		c = getchar();
	}
	while(c >= '0' && c <= '9') {
		rv = (rv<<1) + (rv<<3) + c - '0';
		c = getchar();
	}
	return fh * rv;
}
int n, m, v[MAXN], prime[MAXN], cnt, phi[MAXN];
bool f[MAXN];
void Euler_chk(){
	f[1] = 1;v[1] = 1;
	for(int i = 2 ; i <= n ; i++) {
		if(!f[i]) {
			v[i] = i;
			prime[++cnt] = i;
			phi[i] = i - 1;
		}
		for(int j = 1; i * prime[j] <= n; j++) {
			f[i * prime[j]] = 1;
			v[i * prime[j]] = prime[j];
			if(!(i%prime[j])) {
				phi[i * prime[j]] = phi[i] * prime[j];
				break;
			}
			phi[i * prime[j]] = phi[i] * (prime[j] - 1);
		}
	}
}
int main() {
	n = init(); m = init();
	Euler_chk();
	for(int i = 1 ; i <= n ; i++) printf("%d %d\n", i, phi[i]);
	for(int i = 1; i <= m ; i++) {
		if(f[init()]) printf("No\n");
		else printf("Yes\n");
	}
	return 0;
}
posted @ 2018-03-06 16:47  Mr_Wolfram  阅读(199)  评论(0编辑  收藏  举报