알고리즘

백준 9711번 피보나치 (JAVA)

박카스마시며코딩 2023. 6. 12. 20:49

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

 

9711번: 피보나치

첫 번째 라인에는 정수 T개의 테스트 케이스가 주어진다. 각 테스트 케이스는 정수 P와 Q가 주어진다.

www.acmicpc.net

 

저는 DP를 통해 문제를 해결했습니다.

DP를 통해 이전 값을 저장했습니다. 그리고 값이 long 범위를 넘어가서 BigIntger를 사용해 문제를 해결했습니다.

 

package BOJ.dp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_9711 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Function<String, Integer> stoi = Integer::parseInt;
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = stoi.apply(st.nextToken());
        BigInteger[] dp = new BigInteger[10_000 + 1];
        Arrays.fill(dp, NOT_VALID);
        dp[1] = new BigInteger("1");
        dp[2] = new BigInteger("1");
        for (int i = 1; i <= n; i++) {
            st = new StringTokenizer(br.readLine());
            int p = stoi.apply(st.nextToken());
            int q = stoi.apply(st.nextToken());
            BigInteger result = cal(p, dp).mod(new BigInteger(Integer.toString(q)));
            System.out.println("Case #" + i + ": " + result);
        }
    }

    private static final BigInteger NOT_VALID = new BigInteger("-1");

    private static BigInteger cal(int p, BigInteger[] dp) {
        if (dp[p] != NOT_VALID) {
            return dp[p];
        }
        return dp[p] = cal(p - 1, dp).add(cal(p - 2, dp));
    }
}