본문 바로가기
백준

[JAVA] 백준 13172 - Σ

by 맴썰 2025. 8. 28.

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

문제 설명이 굉장히 긴 문제였지만 결론적으로 a/b를 기약분수 형태로 만들고, b의 모듈러 연산의 역원을 구해 

주사위 1개 당 a * b-1 % 1000000007의 값을 구해 그 합을 구하는 문제였다.

 

일단 a/b를 기약분수 형태로 만들기 위해 유클리드 호제법(퍼플렉시티한테 물어봄)을 통해 최대공약수를 구하고, 페르마의 소정리 (퍼플렉시티한테 물어봄) 로 b의 모듈러 연산의 역원을 구해 이를 a에 곱해주고 나머지를 구했다. 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        long mod = 1000000007;
        int testcase = Integer.parseInt(s);
        long answer = 0;
        for (int i = 0; i < testcase; i++) {
            long[] arr = Arrays.stream(br.readLine().split(" ")).mapToLong(Long::parseLong).toArray();
            long a = arr[0];
            long b = arr[1];
            long gcd = getGcd(a,b);
            a/=gcd;
            b/=gcd;
            long inverse = getFastPow(a,mod-2,mod);
            answer = answer + (b*inverse%mod);
        }
        System.out.println(answer%mod);
    }

    static long getGcd(long a, long b) {
        long rest = a % b;
        while (rest != 0) {
            long temp = rest;
            rest = b % rest;
            b = temp;
        }
        return b;
    }

    static long getFastPow(long a, long target, long mod){
        long answer = 1;
        while(target!=0){
            if((target&1)==1){
                answer = (answer * a)%mod;
            }
            a = (a * a) %mod;
            target>>=1;
        }

        return answer;
    }
}

 

문제를 읽는게 어려운 문제였다.

'백준' 카테고리의 다른 글

[JAVA] 백준 14938 - 서강그라운드  (0) 2025.08.29
[JAVA] 백준 14502 - 연구소  (0) 2025.08.29
[JAVA] 백준 12851 - 숨바꼭질 2  (0) 2025.08.25
[JAVA] 백준 11404 - 플로이드  (0) 2025.08.25
[JAVA] 백준 9935 - 문자열폭발  (0) 2025.08.23