虽然没参加,但是还是记录一下。(只会t1)
t1
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e7+9;
int t,a,cnt;
bool vis[10000020];
int idx[10000020];
int nex[10000020];
void d(){//类似于素数筛
for(int i=7;i<=10;i++){
if(i==7){
for(int j=1;j<=N/i;j++){
vis[i*j]=1;
}
}
}
for(int i=10;i<=100;i++){
if(i%10==7||i/10==7){
for(int j=1;j<=N/i;j++){
vis[i*j]=1;
}
}
}
for(int i=101;i<=1000;i++){
if(i%10==7||i/10%10==7||i/100==7){
for(int j=1;j<=N/i;j++){
vis[i*j]=1;
}
}
}
for(int i=1001;i<=10000;i++){
if(i%10==7||i/10%10==7||i/100%10==7||i/1000==7){
for(int j=1;j<=N/i;j++){
vis[i*j]=1;
}
}
}
for(int i=10001;i<=100000;i++){
if(i%10==7||i/10%10==7||i/100%10==7||i/1000%10==7||i/10000==7){
for(int j=1;j<=N/i;j++){
vis[i*j]=1;
}
}
}
for(int i=100001;i<=1000000;i++){
if(i%10==7||i/10%10==7||i/100%10==7||i/1000%10==7||i/10000%10==7||i/100000==7){
for(int j=1;j<=N/i;j++){
vis[i*j]=1;
}
}
}
for(int i=1000001;i<=10000000;i++){
if(i%10==7||i/10%10==7||i/100%10==7||i/1000%10==7||i/10000%10==7||i/100000%10==7||i/1000000==7){
for(int j=1;j<=N/i;j++){
vis[i*j]=1;
}
}
}
}
int main(){
d();
nex[1]=2;
cnt=1;
for(int i=2;i<=10000019;i++){ //开了O2优化后数组要注意不能越界,否则编译时就会报错
if(!vis[i]) nex[cnt]=i,cnt=i;//O(N)的扫一遍,预处理,否则会超时
}
scanf("%d",&t);
while(t--){
scanf("%d",&a);
if(vis[a]) printf("-1\n");
else {
printf("%d\n",nex[a]);//O(1)的查询输出答案
}
}
}