2×N 크기의 벽을 2×1, 1×2, 1×1 크기의 타일로 채우는 경우의 수를 구해보자.
첫째 줄에 N(1 ≤ N ≤ 1,000,000)이 주어진다.
첫째 줄에 경우의 수를 1,000,000,007로 나눈 나머지를 출력한다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
using namespace std;
long long arr[1000001];
void solve()
{
int N;
scanf("%d", &N);
arr[0] = 1;
arr[1] = 2;
arr[2] = 7;
long long temp = 0;
for (int i = 3; i <= N; i++)
{
temp += arr[i - 3] * 2;
arr[i] = (3 * arr[i - 2] + 2 * arr[i - 1] + temp) % 1000000007;
}
printf("%lld", arr[N]);
}
int main(void)
{
solve();
return 0;
}
일반적인 타일 채우기 형태이다.
연관 : DP