알고리즘
백준 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));
}
}