A - 线性筛素数
Background
本题已更新,从判断素数改为了查询第 kk 小的素数
提示:如果你使用 cin
来读入,建议使用 std::ios::sync_with_stdio(0)
来加速。
Description
如题,给定一个范围 nn,有 qq 个询问,每次输出第 kk 小的素数。
Input
第一行包含两个正整数 n,qn,q,分别表示查询的范围和查询的个数。
接下来 qq 行每行一个正整数 kk,表示查询第 kk 小的素数。
Output
输出 qq 行,每行一个正整数表示答案。
Sample 1
Inputcopy | Outputcopy |
---|---|
100 5 1 2 3 4 5 | 2 3 5 7 11 |
Hint
【数据范围】
对于 100%100% 的数据,n=108n=108,1≤q≤1061≤q≤106,保证查询的素数不大于 nn。
Data by NaCly_Fish.
int isprime[maxn]; // isprime[i]表示i是不是素数
int prime[maxn]; // 现在已经筛出的素数列表
int main()
{
std::ios::sync_with_stdio(0);
int cnt = 1;
cin >> n >> q;
for (int i = 1; i <= n; i++)
{
isprime[i] = 1;//全当成素数
}
isprime[1] = 0;//1不是素数
for (int i = 2; i <= n; i++)
{
if (isprime[i])
{
prime[cnt] = i;
cnt++;
}
for (int j = 1; j <= cnt-1 && i * prime[j] <= n; j++)//遍历所有确定的素数
{
isprime[i * prime[j]] = 0;//让所有确定的素数包括最新的i素数,都与i相乘,保证乘积在范围n内
if (i % prime[j] == 0) break;
// 最神奇的一句话,如果i整除prime[j],退出循环
// 这样可以保证线性的时间复杂度
}
}
for (int i = 0; i < q; i++)
{
int x; cin >> x;
cout << prime[x] << '\n';
}
return 0;
}
图的遍历
经验:如果dfs出现空间不够的时候,可能是因为dfs递归导致的栈不够用,此时通过减枝优化dfs不仅可以缩短实际还能节省空间.