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;
}
posted @ 2021-11-20 15:36  箱庭  阅读(329)  评论(0编辑  收藏  举报