求组时间复杂度
查看原帖
求组时间复杂度
271736
Daidly楼主2021/11/20 19:51

大概是先筛一遍质数,再用质数筛出。

主要是用质数筛出那点。

#include<bits/stdc++.h>
using namespace std;

inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c<='9'&&c>='0'){
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	return x*f;
}

void print(int x){
	if(x<0)putchar('-'),x=-x;
	if(x>9)print(x/10);
	putchar(x%10^48);
}

bool check(int x){
	if(x%7==0)return 1;
	int tmp=x;
	while(tmp){
		if(tmp%10==7)return 1;
		tmp/=10;
	}
	return 0;
}

const int MAXN=1e7+5,maxn=1e7;

int prime[MAXN],cnt1;
bool isprime[MAXN];
int num[MAXN],cnt2;
bool isnum[MAXN];

void getprime(){
	memset(isprime,1,sizeof(isprime));
	isprime[1]=0;
	for(int i=2;i<=maxn;++i){
		if(isprime[i])prime[++cnt1]=i;
		for(int j=1;i*prime[j]<=maxn&&j<=cnt1;++j){
			if(i%prime[j]==0)break;
		}
	}
}

void getnum(){
	for(int i=1;i<=maxn;++i){
		if(check(i))num[++cnt2]=i,isnum[i]=1;
	}
	for(int i=1;i<=cnt2;++i){
		for(int j=1;prime[j]*num[i]<=maxn&&j<=cnt1;++j){
			isnum[prime[j]*num[i]]=1;
		}
	}
	cnt2=0;
	for(int i=1;i<=maxn+1;++i){
		if(!isnum[i])num[++cnt2]=i;
	}
}

int t,n;

int main(){
	getprime();
	getnum();
	t=read();
	while(t--){
		n=read();
		if(isnum[n]){
			puts("-1");
			continue;
		}
		print(num[upper_bound(num+1,num+cnt2+1,n)-num]),puts("");
	}
	return 0;
}
2021/11/20 19:51
加载中...