Algorithm/알고스팟
algospot - asymtiling
jhg0406
2020. 2. 3. 19:27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
//algospot - asymtiling
#include <iostream>
#include <vector>
using namespace std;
#define MOD 1000000007
int N;
//cache[size] : size 크기만큼의 타일을 채울수 있는 경우의 수
vector<int> cache;
void init()
{
cin >> N;
cache = vector<int>(N + 1, -1);
}
//dp[idx] = dp[idx-1] + dp[idx-2]
//dp[1] = 1, dp[2] = 2
int dp(int idx)
{
if (idx == 1)
return 1;
else if (idx == 2)
return 2;
int &ret = cache[idx];
if (ret != -1)
return ret;
ret = dp(idx - 1) + dp(idx - 2);
ret %= MOD;
return ret;
}
int main()
{
int C;
cin >> C;
for (int tn = 0; tn < C; ++tn)
{
init();
if (N == 2)
cout << 0 << "\n";
else if (N % 2)
cout << (dp(N) - dp(N / 2) + MOD) % MOD << "\n";
else
cout << (((dp(N) - dp(N / 2 - 1)+MOD) % MOD) - dp(N / 2) + MOD) % MOD << "\n";
}
}
|
cs |
https://www.algospot.com/judge/problem/read/ASYMTILING
algospot.com :: ASYMTILING
비대칭 타일링 문제 정보 문제 그림과 같이 2 * n 크기의 직사각형을 2 * 1 크기의 타일로 채우려고 합니다. 타일들은 서로 겹쳐서는 안 되고, 90도로 회전해서 쓸 수 있습니다. 단 이 타일링 방법은 좌우 대칭이어서는 안 됩니다. 위 그림은 2 * 5 크기의 직사각형을 채우는 비대칭 타일링 방법 6가지를 보여줍니다. 다음의 2가지는 좌우대칭이기 때문에 세지 않습니다. n 이 주어질 때 가능한 비대칭 타일링 방법의 수를 계산하는 프로그램을 작성하세요.
www.algospot.com
ASYMTILING
2xN 크기의 직사각형 채우는 경우의수 - 2xN 크기의 직사각형중 대칭인 경우의수
