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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM