✨ Algorithm

[λ°±μ€€/C++] 4948번 : λ² λ₯΄νŠΈλž‘ 곡쀀

nitronium102 2021. 8. 8. 21:21

문제

λ² λ₯΄νŠΈλž‘ 곡쀀은 μž„μ˜μ˜ μžμ—°μˆ˜ n에 λŒ€ν•˜μ—¬, n보닀 크고, 2n보닀 μž‘κ±°λ‚˜ 같은 μ†Œμˆ˜λŠ” 적어도 ν•˜λ‚˜ μ‘΄μž¬ν•œλ‹€λŠ” λ‚΄μš©μ„ λ‹΄κ³  μžˆλ‹€. 이 λͺ…μ œλŠ” μ‘°μ œν”„ λ² λ₯΄νŠΈλž‘μ΄ 1845년에 μΆ”μΈ‘ν–ˆκ³ , νŒŒν”„λˆ„ν‹° 체비쇼프가 1850년에 증λͺ…ν–ˆλ‹€.

예λ₯Ό λ“€μ–΄, 10보닀 크고, 20보닀 μž‘κ±°λ‚˜ 같은 μ†Œμˆ˜λŠ” 4κ°œκ°€ μžˆλ‹€. (11, 13, 17, 19) 또, 14보닀 크고, 28보닀 μž‘κ±°λ‚˜ 같은 μ†Œμˆ˜λŠ” 3κ°œκ°€ μžˆλ‹€. (17,19, 23)

μžμ—°μˆ˜ n이 μ£Όμ–΄μ‘Œμ„ λ•Œ, n보닀 크고, 2n보닀 μž‘κ±°λ‚˜ 같은 μ†Œμˆ˜μ˜ 개수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

μž…λ ₯은 μ—¬λŸ¬ 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ 이루어져 μžˆλ‹€. 각 μΌ€μ΄μŠ€λŠ” n을 ν¬ν•¨ν•˜λŠ” ν•œ μ€„λ‘œ 이루어져 μžˆλ‹€.

μž…λ ₯의 λ§ˆμ§€λ§‰μ—λŠ” 0이 μ£Όμ–΄μ§„λ‹€.

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ, n보닀 크고, 2n보닀 μž‘κ±°λ‚˜ 같은 μ†Œμˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

μ œν•œ

  • 1 ≤ n ≤ 123,456

풀이

- μž…λ ₯이 0일 λ•Œ μž…λ ₯ μ’…λ£Œ

- N 초과 2N μ΄ν•˜

μœ„μ˜ 두 쑰건을 μƒκ°ν•˜λ©΄ μ§€λ‚œ λ¬Έμ œμ™€ λΉ„μŠ·ν•œ λ°©λ²•μœΌλ‘œ ν’€ 수 μžˆλ‹€. 

#include <iostream>
#include <cmath>
using namespace std;
int MAX = 123456*2;

int main() {
  int N=-1, cnt = 0, limit;
  bool isPrime[MAX+1];
  while (true){
    cin >> N;
    if (N == 0)
      break;
    fill_n(isPrime, MAX+1, true);
    isPrime[0] = false;
    isPrime[1] = false;

    for (int i=2; i<=sqrt(2*N); i++){
      if (isPrime[i]){
        for (int j=2*i; j<=2*N; j+=i){
          if (2*N > MAX + 1)
            break;
          isPrime[j] = false;
        } 
      }
    }

    for (int i = N+1; i<=2*N; i++){
      if (isPrime[i])
        cnt += 1;
    }

    cout << cnt << "\n";
    cnt = 0;
  }
}

https://www.acmicpc.net/problem/4948

 

4948번: λ² λ₯΄νŠΈλž‘ 곡쀀

λ² λ₯΄νŠΈλž‘ 곡쀀은 μž„μ˜μ˜ μžμ—°μˆ˜ n에 λŒ€ν•˜μ—¬, n보닀 크고, 2n보닀 μž‘κ±°λ‚˜ 같은 μ†Œμˆ˜λŠ” 적어도 ν•˜λ‚˜ μ‘΄μž¬ν•œλ‹€λŠ” λ‚΄μš©μ„ λ‹΄κ³  μžˆλ‹€. 이 λͺ…μ œλŠ” μ‘°μ œν”„ λ² λ₯΄νŠΈλž‘μ΄ 1845년에 μΆ”μΈ‘ν–ˆκ³ , νŒŒν”„λˆ„ν‹° 체비쇼

www.acmicpc.net