#문제
2×N 크기의 벽을 2×1, 1×2, 1×1 크기의 타일로 채우는 경우의 수를 구해보자.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000)이 주어진다.
출력
첫째 줄에 경우의 수를 1,000,000,007로 나눈 나머지를 출력한다.
#작성 코드
#include <cstdio>
long long int memo[1000001][2];
long long int tile(int x){
memo[0][0] = 0;
memo[1][0] = 2;
memo[2][0] = 7;
memo[2][1] = 1;
for(int i=3; i<=x; i++){
// 2*{tile(i-3) + tile(i-4) + ... + tile(0)}부분을 빠르게 계산하기 위해 저장.
memo[i][1] = (memo[i-1][1]+memo[i-3][0])%1000000007;
memo[i][0] = (3*memo[i-2][0]+2*memo[i-1][0]+2*memo[i][1])%1000000007;
}
return memo[x][0];
}
int main(){
int n;
scanf("%d", &n);
printf("%lld\n", tile(n));
return 0;
}
##
'BOJ' 카테고리의 다른 글
BOJ 2579번 :: 계단 오르기 (0) | 2019.12.02 |
---|---|
BOJ 10773번 :: 제로 (0) | 2019.12.02 |
BOJ 2133번 :: 타일 채우기 (0) | 2019.12.01 |
BOJ 11727번 :: 2xN 타일링2 (0) | 2019.12.01 |
BOJ 11726번 :: 2xN타일링 (0) | 2019.12.01 |