CF1608A Find Array 题解

思路

直接想法,为了使后面的一个数不能够被前面的那个数整除,只需要保证前后两个数都是质数就可以了。

但是我们并不想算多少以内能够有 \(1000\) 个质数,所以我们搞线性筛,处理 \(10^7\) 内的质数(其实并不需要这么多,请读者自行尝试处理多少以内就够了)。

代码

2.1 线性筛

如果你还不会,请移步 P3383 【模板】线性筛素数

我们直接跑埃氏筛加动态数组,虽然可能会慢一些,达到了 \(O(n\log \log n)\) 另加大常数,但是 \(10^7\) 还是可以跑的。

bool isprime[10000010];//实际上并不需要跑到这么大
vector <int> nprime;
void prime(int x){
	for(long long i=2;i<=x;i++){
		if(isprime[i]){
			continue;
		}
		else{
			nprime.push_back(i);
			for(long long j=i;i*j<=x;j++){
				isprime[i*j]=true;
			}
		}
	}//普通埃氏筛,用vector把质数存下来。
}

2.2 主程序

prime(10000000);
cin>>t;
while(t--){
	int x;
	cin>>x;
	for(int i=0;i<x;i++){
		cout<<nprime[i]<<" ";//输出我们质数表的前x个即可
	}
	puts("");
}

先跑出 \(10^7\) 以内的质数,然后对于每个询问 \(x\),输出前 \(x\) 个质数就行了。

AC 记录

洛谷 AC

CF 赛时 AC

posted @ 2022-01-26 16:35  Shunpower  阅读(44)  评论(0编辑  收藏  举报