NOIP2021 T1 报数 题解
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;
}