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\) 个质数就行了。