[COCI2008-2009#2] RESETO(埃氏筛法)
题目描述
埃拉托色尼筛法是一种著名的素数筛法,可以查找所有直至 n n n 的素数。该算法的步骤是:
- 写下 2 2 2 到 n n n 之间的所有整数(包括 2 2 2 和 n n n)。
- 找到尚未删除的最小数,并将其命名为 p p p; 则 p p p 是素数。
- 划掉 p p p 及其所有尚未划掉的倍数。
- 如果尚有数未被划掉,请转到步骤 2 2 2。
编写一个程序,给定 n n n 和 k k k,找出第 k k k 个被删除的整数。
输入格式
一行两个整数 n n n 和 k k k,其具体含义请见题目描述。
输出格式
一行一个整数,表示第 k k k 个被划掉的整数。
样例 #1
样例输入 #1
7 3
样例输出 #1
6
样例 #2
样例输入 #2
15 12
样例输出 #2
7
样例 #3
样例输入 #3
520 45
样例输出 #3
90
样例 #4
样例输入 #4
10 7
样例输出 #4
9
样例 #5
样例输入 #5
999 450
样例输出 #5
900
提示说明
数据规模与约定
对于 100 % 100\% 100% 的数据,有 2 ≤ k < n ≤ 1000 2 \leq k < n \leq 1000 2≤k<n≤1000。
说明
题目译自 COCI2008-2009 CONTEST #2 RESETO,译者 @mnesia。
代码内容
// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//队列
// #include <queue>//堆/优先队列
// #include <map>//映射
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e3+10;
ll de[N],cnt;
bool st[N];
int main()
{
ll n,k;
cin>>n>>k;
for(ll i=2;i<=n;i++)
for(ll j=i;j<=n;j+=i)
{
if(st[j]) continue;
st[j]=1;
cnt++;
de[cnt]=j;
if(k==cnt)
{
cout<<de[k]<<endl;
return 0;
}
}
return 0;
}