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
*/