백준 비요뜨의 징검다리 건너기(18291)
1. 힌트
1) 번 위치에서 번째 징검다리에 정확하게 도착하는 경우의 수로 정의할 수 있습니다.
2) 입니다.
3) 부터 거꾸로 계산하면서 수열을 직접 만들어보면 규칙을 찾을 수 있습니다.
2. 접근
1) 뒤에서부터 생각해서 문제를 풀 수 있을까?
힌트 3)에서처럼 뒤에서부터 직접 수열을 만들어보면 다음과 같습니다
뒤에서 두 번째 항부터 배씩 증가하고 있음을 알 수 있습니다. 의 거듭제곱은 으로 단순히 구현할 수 있지만 의 범위가 크므로 분할정복을 이용해서 구현합니다. 임을 이용합니다.
을 한 번 계산해놓으면 거기에 를 곱해서 사용하면 되므로 이 경우 시간 복잡도는 입니다.
3. 구현
import java.io.*;
import java.util.*;
public class Main {
static final int MOD = 1000000007;
// 2의 n승 반환
static long pow(int n) {
if (n == 0) return 1;
if (n % 2 == 0) {
long ret = pow(n / 2);
return ret * ret % MOD;
} else {
return 2 * pow(n - 1) % MOD;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder bw = new StringBuilder();
int TC = Integer.parseInt(br.readLine());
while (TC-- > 0) {
int N = Integer.parseInt(br.readLine());
int ret = 0;
if (N <= 2) {
ret = 1;
} else {
N -= 2;
ret = (int)pow(N);
}
bw.append(ret);
bw.append("\n");
}
System.out.print(bw);
}
}
1) 시간 복잡도
Author And Source
이 문제에 관하여(백준 비요뜨의 징검다리 건너기(18291)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@axiom0510/b18291저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)