BOJ_13172_Σ_java

2023. 1. 6. 12:20Algorithm/BOJ

728x90

BOJ_13172_Σ

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

/**
 백준 13172 Σ
 골드 4
 */
public class BOJ_13172_Σ {
    static final int moduler = 1000000007;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int M = Integer.parseInt(br.readLine());
        int[] N = new int[M];
        int[] S = new int[M];
        int ans = 0;

        for(int i = 0; i<M; i++){
            st = new StringTokenizer(br.readLine());
            N[i] = Integer.parseInt(st.nextToken());
            S[i] = Integer.parseInt(st.nextToken());
            int gcdVal = gcd(N[i], S[i]); // 기약분수
            int a = S[i] / gcdVal;
            int b = N[i] / gcdVal;
            ans += a * getInverseElement(b, moduler -2) % moduler;
            ans %= moduler;
        }
        System.out.println(ans);
    }

    public static long getInverseElement(int b, int exp){ // 역원 구하기
        if(exp == 1){ // 거듭제곱 수가 1인경우
            return b;
        }
        if(exp%2 == 1){ // 거듭제곱 수가 홀수인경우
            return b * getInverseElement(b, exp-1) % moduler;
        }
        long tmp = getInverseElement(b, exp/2);
        return tmp * tmp % moduler; // 거듭제곱 수가 짝수인경우
    }

    public static int gcd(int a, int b){ // 최대 공약수
        if(a<b){
            int tmp = a;
            a = b;
            b = tmp;
        }
        while(b!=0){
            int r = a%b;
            a = b;
            b = r;
        }
        return a;
    }
}

'Algorithm > BOJ' 카테고리의 다른 글

BOJ_12852_1로 만들기 2_java  (0) 2023.01.10
BOJ_14938_서강그라운드_java  (0) 2023.01.09
BOJ_2448_별 찍기 11_java  (0) 2022.12.28
BOJ_1406_에디터_java  (0) 2022.12.27
BOJ_2193_이친수_java  (0) 2022.12.22