求助代码复杂度
查看原帖
求助代码复杂度
317650
lao_lihiOI楼主2021/11/20 19:03

rt,蒟蒻考场上忘了欧拉筛怎么写,自己推了一个鬼东西,不知道复杂度是多少?

#include <bits/stdc++.h>
#define rep(a, b, c) for(int a = b; a <= c; a ++)
using namespace std;
template<class T> void read(T &x) {
	x = 0; int f = 1; char ch = getchar();
	while(!isdigit(ch)) { if(ch == '-') f = -1; ch = getchar(); }
	while(isdigit(ch)) { x = x * 10 + ch - '0'; ch = getchar(); }
	x *= f;
}
const int MAXN = 1e7 + 105, MAXT = 2e5 + 5;
int vis1[MAXN], vis2[MAXN];
int prime1[MAXN], cnt1, prime2[MAXN], cnt2;
int T, task[MAXT], MAX, ans[MAXN];
int check(int x) {
	while(x) {
		if(x % 10 == 7) return 1;
		x /= 10;
	}
	return 0;
}
void getprime(int ee) {
	vis1[1] = 1;
	for(int i = 2; i <= ee; i ++) {
		if(vis1[i] == 0) prime1[++ cnt1] = i;
		if(vis2[i] == 1 || check(i)) vis2[i] = 1, prime2[++ cnt2] = i;
		
		//如果是普通的数,就筛质数,筛p 
		if(vis2[i] == 0) {
			//筛质数 
			for(int j = 1; j <= cnt1 && i * prime1[j] <= ee; j ++) {
				vis1[i * prime1[j]] = 1;
			}
			//筛p
			for(int j = 1; j <= cnt2 && i * prime2[j] <= ee; j ++) {
				vis2[i * prime2[j]] = 1;
			}
		}
		//如果p=1,就筛p 
		else {
			//筛p 
			for(int j = 1; j <= cnt1 && i * prime1[j] <= ee; j ++) {
				vis2[i * prime1[j]] = 1;
			}
		}
	}
}
int main() {
	freopen("number.in", "r", stdin); freopen("number.out", "w", stdout);
	read(T);
	rep(i, 1, T) {
		read(task[i]);
		MAX = max(MAX, task[i]);
	}
	getprime(MAX + 100);
	int p = 1;
	rep(i, 2, MAX + 100) {
		if(!vis2[i]) {
			rep(j, p, i - 1) ans[j] = i;
			p = i;
		}
	}
	//不能报vis=1的数 
	rep(i, 1, T)
		if(vis2[task[i]]) puts("-1");
		else printf("%d\n", ans[task[i]]);
	return 0;
}

/*
in
5 
90
99
106
114
169

out
92
100
109
-1
180



in
4
6
33
69
300
out
8
36
80
-1
*/

2021/11/20 19:03
加载中...