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;
}
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号