๐Ÿ•๏ธ ICPC Sinchon/Basic Math

[BOJ][C++] ๋ฐฑ์ค€ 9421๋ฒˆ: ์†Œ์ˆ˜์ƒ๊ทผ์ˆ˜

์„ ๋‹ฌ 2023. 6. 2. 23:35
๋ฐ˜์‘ํ˜•

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

 

9421๋ฒˆ: ์†Œ์ˆ˜์ƒ๊ทผ์ˆ˜

์–‘์˜ ์ •์ˆ˜ n์˜ ๊ฐ ์ž๋ฆฌ์ˆ˜์˜ ์ œ๊ณฑ์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ๋‚˜์˜จ ํ•ฉ๋„ ๊ฐ ์ž๋ฆฌ์ˆ˜์˜ ์ œ๊ณฑ์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐ˜๋ณตํ•ด์„œ 1์ด ๋‚˜์˜จ๋‹ค๋ฉด, n์„ ์ƒ๊ทผ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค. 700์€ ์ƒ๊ทผ์ˆ˜์ด๋‹ค. 72 + 02 + 02 =

www.acmicpc.net

 

๋ฌธ์ œ

์–‘์˜ ์ •์ˆ˜ n์˜ ๊ฐ ์ž๋ฆฌ์ˆ˜์˜ ์ œ๊ณฑ์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ๋‚˜์˜จ ํ•ฉ๋„ ๊ฐ ์ž๋ฆฌ์ˆ˜์˜ ์ œ๊ณฑ์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐ˜๋ณตํ•ด์„œ 1์ด ๋‚˜์˜จ๋‹ค๋ฉด, n์„ ์ƒ๊ทผ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.

700์€ ์ƒ๊ทผ์ˆ˜์ด๋‹ค.

  • 72 + 02 + 02 = 49
  • 42 + 92 = 97
  • 92 + 72 = 130
  • 12 + 32 + 02 = 10
  • 12 + 02 = 1

2๋Š” ์ƒ๊ทผ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.

  • 22 = 4
  • 42 = 16
  • 12 + 62 = 37
  • 32 + 72 = 58
  • 52 + 82 = 89
  • 82 + 92 = 145
  • 12 + 42 + 52 = 42
  • 42 + 22 = 20
  • 22 + 02 = 4
  • 42 = 16
  • ... ๋๋‚˜์ง€ ์•Š๋Š”๋‹ค

์†Œ์ˆ˜๋Š” 1๊ณผ ์ž๊ธฐ์ž์‹ ์„ ์ œ์™ธํ•˜๊ณ  ์•ฝ์ˆ˜๊ฐ€ ์—†๋Š” ์ˆ˜์ด๋‹ค. 2, 3, 5, 7, 11, 13, 17, 19, ... ๋Š” ์†Œ์ˆ˜์ด๋‹ค.

์†Œ์ˆ˜์ƒ๊ทผ์ˆ˜๋Š” ์†Œ์ˆ˜์ด๋ฉด์„œ ์ƒ๊ทผ์ˆ˜์ธ ์ˆซ์ž์ด๋‹ค. 7, 13, 19, ... ๋Š” ์†Œ์ˆ˜ ์ƒ๊ทผ์ˆ˜์ด๋‹ค.

n์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, n๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๋ชจ๋“  ์†Œ์ˆ˜์ƒ๊ทผ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— n (10 ≤ n ≤ 1000000)์ด ์ฃผ์–ด์ง„๋‹ค.

 

ํ’€์ด

n๊นŒ์ง€์˜ ๋ชจ๋“  ์ˆ˜๋“ค์ด true์ธ ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค.

์—๋ผํ† ์Šคํ…Œ๋„ค์Šค๋กœ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์• ๋“ค์„ false๋กœ ๊ฑธ๋Ÿฌ๋‚ธ๋‹ค

๋ฌธ์ œ์— ๋‚˜์˜จ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•ด์„œ ์ƒ๊ทผ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ๋„ false๋กœ ๊ฑธ๋Ÿฌ๋‚ธ๋‹ค

 

์ƒ๊ทผ์ˆ˜ ํŒ๋ณ„ :

๊ฐ ์ž๋ฆฌ ์ˆซ์ž์˜ ์ œ๊ณฑ์„ ๋”ํ•œ ๊ฐ’๋“ค์„ ์—ฐ์†์ ์œผ๋กœ ๊ตฌํ•˜๋ฉด์„œ ํ•œ๋ฒˆ์ด๋ผ๋„ ๊ตฌํ–ˆ๋˜ ๊ฐ’์ด ๋‚˜์˜ค๋ฉด ์ง€๊ธˆ๊นŒ์ง€ ๋‚˜์™”๋˜ ๊ฐ’๋“ค์€ ์ „๋ถ€ false์ฒ˜๋ฆฌํ•œ๋‹ค

(์–ด์ฐจํ”ผ ์ˆœํ™˜ํ• ๊ฒŒ ๋ป”ํ•˜๊ธฐ ๋•Œ๋ฌธ)

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

const int INF = 1000001;

vector<bool> isSoSang(INF, true);

// ๊ฐ ์ž๋ฆฌ ์ˆซ์ž ์ œ๊ณฑ ๋”ํ•˜๋Š” ํ•จ์ˆ˜
int sumOfDigit(int num) {
    int sum = 0;
    while(num>0) {
        sum += (num%10)*(num%10);
        num/=10;
    }
    return sum;
}

int main() {
    int n;
    cin >> n;
    
    // ์†Œ์ˆ˜ ํŒ๋ณ„
    isSoSang[0] = isSoSang[1] = false;
    for(int i=2; i<=sqrt(n); i++) {
        if(!isSoSang[i])
            continue;
        for(int j=i*i; j<=n; j+=i)
            isSoSang[j] = false;
    }
    
    // ์†Œ์ˆ˜์ƒ๊ทผ์ˆ˜ ํŒ๋ณ„
    for(int i=2; i<=n; i++) {
        if(!isSoSang[i]) // ์†Œ์ˆ˜ ์•„๋‹ˆ๋ฉด ์‚ดํŽด๋ณผ ํ•„์š”๋„ ์—†์ด ๋„˜์–ด๊ฐ„๋‹ค
            continue;
        int tmp = i;
        vector<int> history;
        while(true) {
            if(tmp == 1) {
                // ์•—! 1์ด ๋‚˜์™”๋‹ค!
                break;
            }
            if(count(history.begin(), history.end(), tmp) != 0) { 
                // ์•—! ์ˆœํ™˜์ด ๋ฐœ๊ฒฌ๋˜์—ˆ๋‹ค!
                for(int j : history) // ๋‚˜์™”๋˜ ์• ๋“ค ์ „๋ถ€ ์ƒ๊ทผ์ˆ˜ ์ œ์™ธ
                    isSoSang[j] = false;
                break;
            }
            history.push_back(tmp);
            tmp = sumOfDigit(tmp);
        }
    }
    
    // ์ถœ๋ ฅ
    for(int i=2; i<=n; i++) {
        if(isSoSang[i])
            cout << i << "\n";
    }
    
    return 0;
}
๋ฐ˜์‘ํ˜•