平铺方案【Ybtoj】

D e s c r i p t i o n Description Description

您可以通过几种方式用 2 ∗ 1 2*1 21 2 ∗ 2 2*2 22瓦片平铺 2 ∗ n 2*n 2n矩形?

这是一个 2 ∗ 17 2*17 217矩形的样本拼贴:

I n p u t Input Input

每行一个整数 n n n

O u t p u t Output Output

每行一个整数,表示方案数。

S a m p l e Sample Sample I n p u t Input Input
2
8
12
100
200
S a m p l e Sample Sample O u t p u t Output Output
3
171
2731
845100400152152934331135470251
1071292029505993517027974728227441735014801995855195223534251

H i n t Hint Hint

对于 100 % 100\% 100%的数据, 0 ≤ n ≤ 250 0 \leq n \leq 250 0n250

T r a i n Train Train o f of of T h o u g h t Thought Thought

F k F_k Fk表示有k列的方案数
那么可以考虑
1. F k − 1 1.F_{k-1} 1.Fk1中最后加一个 2 ∗ 1 2*1 21的方块
2. F k − 2 2.F_{k-2} 2.Fk2中最后加两个 1 ∗ 2 1*2 12的方块,或者一个 2 ∗ 2 2*2 22的方块
那么 F k = F k − 1 + F k − 2 ∗ 2 F_k=F_{k-1}+F_{k-2}*2 Fk=Fk1+Fk22
ps
高精压位

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define Mod 10000
#define ll long long
using namespace std;

const int N = 500;

ll A[300][N + 5];
ll n;

void Add(int k)
{
    
    
	int g = 0;
	for(int i = 1; i <= N; ++i)
	{
    
    
		A[k][i] = 2 * A[k - 2][i] + A[k - 1][i] + g;
		g = A[k][i] / Mod;
		A[k][i] %= Mod;
	}
}

int main()
{
    
    
	A[1][1] = 1, A[2][1] = 3;
	for(int i = 3; i <= 250; ++i)
		Add(i);
	scanf("%lld", &n);
	while(n)
	{
    
    
		int l = N + 1;
		while(--l && !A[n][l]);
		printf("%lld", A[n][l]);
		while(--l > 0)
		{
    
    
			if(A[n][l] < 1000)printf("0");
			else if(A[n][l] < 100)printf("00");
			else if(A[n][l] < 10)printf("000");
			printf("%lld", A[n][l]);
		}
		printf("\n");
		n = 0;
		scanf("%lld", &n);
	}
}

猜你喜欢

转载自blog.csdn.net/SSL_wujiajie/article/details/111727853