P7960 [NOIP2021] 报数

读完题目之后思路就出来了 但是不敢下手怕时间过不去1e7感觉好大

就是类似埃筛的方法将1e7以内该跳过的数都筛出来 加入在set里面

最后查询的话直接log就可以了

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=1e7+5;
int vis[maxn];
int T,x;
set<int>mp;
set<int>::iterator id;
bool seven(int u){
	while(u){
		if(u%10==7)return true;
		u/=10;
	}
	return false;
}
void init(){
	for(int i=1;i<maxn;i++)
		if(!vis[i]&&seven(i))
		for(int j=1;j*i<maxn;j++)
		vis[i*j]=1;
	for(int i=1;i<maxn;i++)
	if(!vis[i])mp.insert(i);
}
int main(){
	cin>>T;
	init();
	while(T--){
	scanf("%d",&x);
	if(vis[x])cout<<-1<<endl;
	else {
		id=mp.find(x);id++;
		printf("%d\n",*id);
	}
	}
     return 0;
}

posted @ 2022-03-31 20:10  wzx_believer  阅读(42)  评论(0编辑  收藏  举报