AFO了,來最后寫一波題解。
T1 不算陰間,題意很直白,所以想先順着題意打一波模擬。
算一下,發現 1e7 的 $O(nlog(n))$ 時間復雜度好像可以直接過( 實際上是$O(nloglog(n))$,更小 )。
所以手打了一個埃式篩,發現 1e7 的下一個就是 1e7+1。
至於求下一個,則在篩的時候順便保存到數組里去。(當然,也可以分開求)
所以就先運行篩法,然后 $O(1)$ 出答案。
本機運行 0.6 秒,直接不管了,看下一題。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fu(i,l,r) for(int i=l;i<=r;++i)
#define fd(i,l,r) for(int i=l;i>=r;--i)
#define po printf
const int maxn=1e7+5;
const int INF=0x3f3f3f3f;
int T,n,m;
int nxt[maxn];
bool is7[maxn];
inline int read(){
int a=0; char x; int w=0;
x=getchar();
while(!isdigit(x)) {if(x=='-') w=1;x=getchar();}
while(isdigit(x)) {a=a*10+x-'0';x=getchar();}
return w?-a:a;}
bool contain7(int x){
while(x){
if(x%10==7) return 1;
x/=10;
}
return 0;
}//直白的命名
void shai(int n){
int preI=0;
fu(i,1,n){
if(contain7(i)){
is7[i]=1;
for(int j=2;i*j<=n;++j){
is7[i*j]=1;
}
}else{
if(!is7[i]){
nxt[preI]=i;//維護下一個合法的數字
preI=i;
}
}
}
}//先進行埃篩,n log(n)
void solve(){
cin>>T;
fu(i,1,T){
int x=read();
if(is7[x]){//O(1)求答案
po("-1\n");
}else{
po("%d\n",nxt[x]);
}
}
}
signed main()
{
// freopen("number.in", "r",stdin);
// freopen("number.out","w",stdout);
int n=1e7+5;
shai(n);
solve();
return 0;
}