๊ธฐ๋ก๋ฐฉ

BOJ_13172 : Σ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_13172 : Σ

Soom_1n 2024. 3. 10. 20:24

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ

 

13172๋ฒˆ: Σ

๋ชจ๋“ˆ๋Ÿฌ๊ฐ€ 11์—์„œ 1,000,000,007์ด ๋˜์–ด ๋‹ต์ด ๋‹ฌ๋ผ์กŒ์ง€๋งŒ, ์—ญ์‹œ 3์„ ๊ณฑํ•œ ๋‹ค์Œ 1,000,000,007์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋Š” 7์ด ๋œ๋‹ค.

www.acmicpc.net



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • ์ฃผ์‚ฌ์œ„ M๊ฐœ์— ๋Œ€ํ•ด i๋ฒˆ์งธ ์ฃผ์‚ฌ์œ„์˜ ๋ฉด ๊ฐœ์ˆ˜๋Š” Ni, ๋ฉด์˜ ๋ชจ๋“  ๊ฐ’์˜ ์ดํ•ฉ์€ Si๋กœ ์ž…๋ ฅ๋œ๋‹ค.
  • ๋ชจ๋“  ์ฃผ์‚ฌ์œ„๋ฅผ ๋˜์กŒ์„ ๋•Œ์˜ ๊ธฐ๋Œ€๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค.
    • S1/N1 + S2/N2 + ... + SM/NM  ๊ณ„์‚ฐ์˜ ์–ด๋ ค์›€ ๋•Œ๋ฌธ์— ์ž„์˜์˜ ๋ถ„์ˆ˜ a / b๋ฅผ ๋ชจ๋“ˆ๋Ÿฌ๋ฅผ ์ด์šฉํ•ด (a * b-1 mod x)์˜ ์ •์ˆ˜ ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค.

๐Ÿ”ธ ๋ฌธ์ œ ํ’€์ด ๐Ÿ”ธ

  • ๋ฌธ์ œ์˜ ์ˆ˜ํ•™ ์ด๋ก  ์„ค๋ช…์ด ๊ฝค ๊ธธ์ง€๋งŒ, ์ฝ์–ด๋ณด๋ฉด ์ดํ•ด ๋ชปํ•  ์ •๋„๋Š” ์•„๋‹ˆ๋‹ค. ๋ณด๋‹ค ์ •ํ™•ํ•œ ํ™•๋ฅ  ๊ณ„์‚ฐ์„ ์œ„ํ•ด ๋ชจ๋“ˆ๋Ÿฌ ํ‘œํ˜„ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋ฌธ์ œ์—์„œ ์ œ์‹œ๋œ ๊ณต์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์ค‘์š”ํ•œ๊ฑด a/b๋ฅผ a * b^-1 mod X๋กœ ๋ณ€ํ™˜ํ•ด ๋ˆ„์ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    • b^-1 (mod X)์€ ํŽ˜๋ฅด๋งˆ์˜ ์†Œ์ •๋ฆฌ์— ์˜ํ•ด b^(X-2) (mod X)์™€ ๊ฐ™๋‹ค๊ณ  ํ•œ๋‹ค.
    • ๋ชจ๋“ˆ๋Ÿฌ ๊ฐ’์ด 1,000,000,007์ด๋ฏ€๋กœ,  S * N^(1,000,000,007 - 2) % 1,000,000,007 ๊ฐ’์„ ๋ˆ„์  ํ›„ ์ถœ๋ ฅํ•œ๋‹ค.
  • ๊ฑฐ๋“ญ์ œ๊ณฑ์˜ ๊ฐ’์ด ๋ชจ๋“ˆ๋Ÿฌ ๊ฐ’-2 ๋กœ ์•„์ฃผ ํฌ๋ฏ€๋กœ ๋น ๋ฅธ ๊ฑฐ๋“ญ์ œ๊ณฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Fast Power Algorithm)์„ ์‚ฌ์šฉํ•œ๋‹ค.
    ๋น ๋ฅธ ๊ฑฐ๋“ญ์ œ๊ณฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ํ™”์‹ (์ถœ์ฒ˜:์ด๋ฏธ์ง€ํด๋ฆญ)

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    private static final int MOD = 1_000_000_007;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int M = Integer.parseInt(br.readLine());

        long answer = 0;

        for (int i = 0; i < M; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken()); // ์ฃผ์‚ฌ์œ„ ๋ฉด ๊ฐœ์ˆ˜
            int S = Integer.parseInt(st.nextToken()); // ์ฃผ์‚ฌ์œ„ ๋ฉด ์ดํ•ฉ

            long b = S * fast_power_algorithme(N, MOD - 2) % MOD;
            answer = (answer + b) % MOD;
        }

        bw.write(Long.toString(answer));
        bw.flush();
    }

    private static long fast_power_algorithme(long a, int n) {
        long r = 1;
        while (n > 0) {
            if ((n & 1) == 1) r = r * a % MOD;
            a = a * a % MOD;
            n >>= 1;
        }
        return r;
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • ์ฃผ์‚ฌ์œ„ ๋ฉด์˜ ๊ฐœ์ˆ˜ N๊ณผ ์ฃผ์‚ฌ์œ„ ๊ฐ’์˜ ์ดํ•ฉ S๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๊ธฐ๋Œ€๊ฐ’์„ ๊ณ„์‚ฐํ•ด ๋ˆ„์ ํ•œ๋‹ค.
    • ๊ธฐ๋Œ€๊ฐ’์€ S/N์œผ๋กœ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ, ๋ฌธ์ œ์—์„œ ์ œ์‹œ๋œ ๋ชจ๋“ˆ๋Ÿฌ ๊ณต์‹์— ๋”ฐ๋ผ S * (N์˜ mod-1 ์ œ๊ณฑ) %mod๋กœ ๊ณ„์‚ฐํ•œ๋‹ค.
  • ๊ฑฐ๋“ญ์ œ๊ณฑ์˜ ์ˆ˜๊ฐ€ ํฌ๋ฏ€๋กœ ๋น ๋ฅธ ๊ฑฐ๋“ญ์ œ๊ณฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด fast_power_algorithm() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.
    • ๋น„ํŠธ ๋‹จ์œ„๋กœ ํ™•์ธํ•ด ๊ฐ’์„ ๊ฑฐ๋“ญ์ œ๊ณฑํ•œ๋‹ค. ์ด๋•Œ ๊ฐ’์„ mod๋กœ ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ํ•ด์„œ ๊ฐ’์ด ์ปค์ง€์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
  • ๊ฐ’์„ ๋ˆ„์ ํ•  ๋•Œ๋„ ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • ๋ˆ„์  ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ์ดˆ๋ฐ˜์— ๋ฌธ์ œ ์ดํ•ด๋Š” ์–ด๋Š์ •๋„ ํ–ˆ์ง€๋งŒ, ์ฃผ์–ด์ง„ ๊ณต์‹์„ ์ฝ”๋“œ๋กœ ์–ด๋–ป๊ฒŒ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค๋Š” ๊ฑด์ง€ ๊ฐ์„ ์žก์ง€ ๋ชปํ•ด ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.
    • ํ•ด๋‹น ๋ฌธ์ œ์˜ C++ํ’€์ด ์งˆ๋ฌธ๊ธ€์„ ์ฐธ๊ณ ํ–ˆ๋Š”๋ฐ, ๋ฐ”๋กœ ์ดํ•ด๊ฐ€ ๋˜์–ด์„œ ํ’€์ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
    • ์งˆ๋ฌธ๊ธ€์— ๊ฑฐ๋“ญ์ œ๊ณฑ์„ ํŠน์ดํ•˜๊ฒŒ ๊ตฌํ˜„ํ–ˆ๊ธธ๋ž˜ ์ฐพ์•„๋ณด์•˜๋Š”๋ฐ ๋น ๋ฅธ ๊ฑฐ๋“ญ์ œ๊ณฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • Math.pow๋กœ ๊ณ„์‚ฐํ–ˆ์„๋•Œ๋Š” ์ฃผ์–ด์ง„ ๋ชจ๋“ˆ๊ฐ’์„ ๊ณ„์‚ฐํ•˜์ง€ ๋ชปํ•˜๊ณ  Infinity๊ฐ€ ๋‚ฌ์—ˆ๋‹ค.
  • ํ’€๊ณ ๋‚˜์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜๋ฅผ ๋ณด๋‹ˆ, ๋ถ„ํ•  ์ •๋ณต์„ ์ด์šฉํ•œ ๊ฑฐ๋“ญ์ œ๊ณฑ, ๋ชจ๋“ˆ๋กœ ๊ณฑ์…ˆ ์—ญ์›, ํŽ˜๋ฅด๋งˆ์˜ ์†Œ์ •๋ฆฌ ํƒœ๊ทธ๋ฅผ ์ฒ˜์Œ ๋ณธ ๊ฒƒ ๊ฐ™์•˜๋‹ค.
    • ๋ชจ๋“ˆ๋กœ ๊ณฑ์…ˆ ์—ญ์›๊ณผ ํŽ˜๋ฅด๋งˆ์˜ ์†Œ์ •๋ฆฌ๋Š” ๋ฌธ์ œ์— ์ œ์‹œ๋œ ์ˆ˜ํ•™ ์›๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ๋ฌธ์ œ๋“ค์ธ ๊ฒƒ ๊ฐ™๋‹ค.
    • ๋ถ„ํ• ์ •๋ณต์„ ์ด์šฉํ•œ ๊ฑฐ๋“ญ์ œ๊ณฑ์€ ์œ„์—์„œ ๋‚˜์˜จ ๋น ๋ฅธ ๊ฑฐ๋“ญ์ œ๊ณฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ถ„ํ• ์ •๋ณต์—์„œ ์•„์ด๋””์–ด๊ฐ€ ๋‚˜์™€์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™๋‹ค.

 

728x90