algorithm

๋ฐฑ์ค€ 1630

rkawk 2024. 4. 8. 22:12

๋ฌธ์ œ

๋”๋ณด๊ธฐ

์˜ค๋ฏผ์‹ ์„ฑ๊ณต

 

์˜ค๋ฏผ์‹์„ ๋งŒ์กฑํ•˜๋Š” ์ˆ˜: 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , N๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๋ชจ๋“  ์ž์—ฐ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋Š” ์ˆ˜.

์˜์‹์ด์™€ ๋‹ค์†œ์ด๋Š” N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์˜ค๋ฏผ์‹์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜๊ฐ€ ๊ถ๊ธˆํ•ด์กŒ๋‹ค. ๊ทธ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ž์—ฐ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 1,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ฃผ์–ด์ง„ ์ž…๋ ฅ์— ๋Œ€ํ•ด ์˜ค๋ฏผ์‹์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ž์—ฐ์ˆ˜๋ฅผ 987654321๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

ํ’€์ด

1 ๋ถ€ํ„ฐ ์—ฐ์†๋˜๋Š” ์ฆ๊ฐ€ํ•˜๋Š” ์ •์ˆ˜๋“ค์˜ ๊ณฑ์…ˆ์—์„œ ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ทœ์น™์„ ์ฐพ์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ’€๋ฆฐ๋‹ค.

๋ชจ๋“  ์ˆ˜๋Š” 1๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฏ€๋กœ 1์€ ์ œ์™ธํ•˜๊ณ , 2๋ถ€ํ„ฐ ์—ฐ์†ํ•ด์„œ ๋‚˜์—ดํ•ด๋ณด๋ฉด

2, 3, 2^2, 5, 2 * 3, 7, 2^3, 3^2 ์™€ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

์ˆœ์„œ๋Œ€๋กœ ๊ณฑํ•ด๊ฐ€๋ฉด์„œ ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜๋ฅผ ํ™•์ธํ•˜๋ฉด ์šฐ์„ ์ ์œผ๋กœ

1.  lcm(a, b) = (a * b) % gcd(a, b) ์ด๋‹ค. a, b๊ฐ€ ์„œ๋กœ์†Œ์ด๋ฉด gcd(a, b)๋Š” 1์ด๊ณ , a, b์ค‘ ํ•˜๋‚˜๊ฐ€ ์†Œ์ˆ˜๋ผ๋ฉด ํ•ญ์ƒ ์„œ๋กœ์†Œ์ด๋ฏ€๋กœ

a, b ๋‘˜์ค‘ ํ•˜๋‚˜๊ฐ€ ์†Œ์ˆ˜๋ผ๋ฉด lcm(a, b) = a * b์ด๋‹ค. ๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

2. lcm(a, b) = (a * b) % gcd(a, b)๋ฅผ ๋‹ค์‹œ ๊ธฐ์–ตํ•ด์„œ, ์†Œ์ˆ˜์˜ N์Šน์— ํ•ด๋‹นํ•˜๋Š” ์ž์—ฐ์ˆ˜๊ฐ€ ๋‚˜์˜ค๋ฉด lcm ๊ณ„์‚ฐ ๊ณผ์ •์—์„œ ํ•ญ์ƒ gcd๋กœ mod ์—ฐ์‚ฐ์„ ํ•ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ์†Œ์ˆ˜์˜ N - 1์Šน ๊นŒ์ง€๋งŒ ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜๊ฐ€ ๋งŒ์กฑํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค ์„ ์•Œ์ˆ˜์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, 1 ๋ถ€ํ„ฐ 7 ๊นŒ์ง€ ๊ณฑํ–ˆ์„๋•Œ ์ด์ „์— ๊ณ„์‚ฐ ๊ณผ์ •์— ๋”ฐ๋ผ 2^2 * 3 * 5 * 7 ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 8์€ 2^3์ด๊ณ , lcm์—์„œ 2๊ฐ€ ํ•˜๋‚˜ ๋ถ€์กฑํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋‘๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

 

๋”๋ณด๊ธฐ
#include <iostream>
#include <vector>
#define ll long long
using namespace std;
int isPrime[1000001], isTime[1000001];
vector<int>priArr;
void pcheck() {
    for(int i=2; i <= 1000000; i++) isPrime[i] = i;
    for(int i=2; i*i <=1000000; i++) {
        if(!isPrime[i]) continue;
        for(int j = i*i; j<=1000000; j += i) isPrime[j] = 0;
    }
    for(int i=2; i<=1000000; i++)
        if(isPrime[i]) priArr.push_back(i);
}
int main() {
    ll a = 1, N;
    cin>>N;
    pcheck();
    for(auto e : priArr) {
        long long check = e;
        while(check * e <= 1000000){
            check = check * e;
            isTime[check] = e;
        }
    }
    for(int i=1; i<=N; i++){
        if(isPrime[i])
            a = (a*i)%987654321;
        else {
            if(isTime[i])
                a = (a*isTime[i])%987654321;
        }
    }
    cout<<a;
}

 

'algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ฐฑ์ค€ 1987  (1) 2024.06.12
Codeforces Round 938 (Div. 3)  (0) 2024.05.02
BOJ 3197  (0) 2024.03.24
BOJ 6087  (1) 2024.03.20
BOJ 5615  (0) 2024.03.15