大概是先筛一遍质数,再用质数筛出。
主要是用质数筛出那点。
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c<='9'&&c>='0'){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x*f;
}
void print(int x){
if(x<0)putchar('-'),x=-x;
if(x>9)print(x/10);
putchar(x%10^48);
}
bool check(int x){
if(x%7==0)return 1;
int tmp=x;
while(tmp){
if(tmp%10==7)return 1;
tmp/=10;
}
return 0;
}
const int MAXN=1e7+5,maxn=1e7;
int prime[MAXN],cnt1;
bool isprime[MAXN];
int num[MAXN],cnt2;
bool isnum[MAXN];
void getprime(){
memset(isprime,1,sizeof(isprime));
isprime[1]=0;
for(int i=2;i<=maxn;++i){
if(isprime[i])prime[++cnt1]=i;
for(int j=1;i*prime[j]<=maxn&&j<=cnt1;++j){
if(i%prime[j]==0)break;
}
}
}
void getnum(){
for(int i=1;i<=maxn;++i){
if(check(i))num[++cnt2]=i,isnum[i]=1;
}
for(int i=1;i<=cnt2;++i){
for(int j=1;prime[j]*num[i]<=maxn&&j<=cnt1;++j){
isnum[prime[j]*num[i]]=1;
}
}
cnt2=0;
for(int i=1;i<=maxn+1;++i){
if(!isnum[i])num[++cnt2]=i;
}
}
int t,n;
int main(){
getprime();
getnum();
t=read();
while(t--){
n=read();
if(isnum[n]){
puts("-1");
continue;
}
print(num[upper_bound(num+1,num+cnt2+1,n)-num]),puts("");
}
return 0;
}