본문 바로가기

백준/수학

백준 15965 - K번째 소수

728x90

필요 지식

이 문제는 소수 정리를 알면 매우 단순해진다.

풀이

소수 정리에 의해 ${e^{16} \over 16} \approx 555381$를 계산할 수 있고 $e^{16}$ 정도의 범위는 에라토스테네스의 체로 충분히 계산할 수 있음을 알 수 있다.

 

체를 돌려 50만번째 소수까지 찾아 출력하도록 하면 된다.

 

전체 코드 - 여기서는 linear sieve를 사용했다.

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,avx,avx2,fma")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
 
#include "bits/stdc++.h"
 
using namespace std;
 
vector<vector<int>> linear_sieve(int n) {
  vector<int> spf(n + 1), prime_set;
 
  for (int i = 2; i <= n; ++i) {
    if (!spf[i]) {
      prime_set.push_back(i);
      spf[i] = i;
    }
 
    for (int j = 0; (long long)i * prime_set[j] <= n; ++j) {
      spf[i * prime_set[j]] = prime_set[j];
      if (i % prime_set[j] == 0)
        break;
    }
  }
 
  return { prime_set, spf }; // 0: prime numbers, 1: spf
}
 
void solve()
{
  int n;
  cin >> n;
 
  auto res = linear_sieve(8888888);
  cout << res[0][n - 1];
}
 
int main()
{
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
 
  solve();
}
cs

제출 기록

 

 

728x90

'백준 > 수학' 카테고리의 다른 글

백준 14848 - 정수 게임  (0) 2022.07.12
백준 2381 - 최대 거리  (0) 2022.07.06
백준 16878 - 궁전  (0) 2022.05.04
백준 1402 - 아무래도이문제는A번난이도인것같다  (0) 2022.04.05
백준 16563 - 어려운 소인수분해  (0) 2021.08.23