NOIP2021 T1 报数 题解

AFO了,来最后写一波题解。

T1 不算阴间,题意很直白,所以想先顺着题意打一波模拟。

算一下,发现 1e7 的 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) 时间复杂度好像可以直接过( 实际上是 O ( n l o g l o g ( n ) ) O(nloglog(n)) O(nloglog(n)),更小 )。

所以手打了一个埃式筛,发现 1e7 的下一个就是 1e7+1。

至于求下一个,则在筛的时候顺便保存到数组里去。(当然,也可以分开求)

所以就先运行筛法,然后 O ( 1 ) O(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值