P1990 覆盖墙壁

本文介绍了一道编程题,涉及如何利用两种不同类型的砖头(1x1和L型3x1)动态地覆盖宽度为2N的墙壁。通过状态表示和递推计算出所有可能的覆盖方法,最后输出最后四位数字。
摘要由CSDN通过智能技术生成

P1990 覆盖墙壁

覆盖墙壁

题目描述

你有一个长为 N N N 宽为 2 2 2 的墙壁,给你两种砖头:一个长 2 2 2 1 1 1,另一个是 L 型覆盖 3 3 3 个单元的砖头。如下图:

0  0
0  00

砖头可以旋转,两种砖头可以无限制提供。你的任务是计算用这两种来覆盖 N × 2 N\times 2 N×2 的墙壁的覆盖方法。例如一个 2 × 3 2\times3 2×3 的墙可以有 5 5 5 种覆盖方法,如下:

012 002 011 001 011  
012 112 022 011 001

注意可以使用两种砖头混合起来覆盖,如 2 × 4 2\times4 2×4 的墙可以这样覆盖:

0112
0012

给定 N N N,要求计算 2 × N 2\times N 2×N 的墙壁的覆盖方法。由于结果很大,所以只要求输出最后 4 4 4 位。例如 2 × 13 2\times 13 2×13 的覆盖方法为 13465 13465 13465,只需输出 3465 3465 3465 即可。如果答案少于 4 4 4 位,就直接输出就可以,不用加前导 0 0 0,如 N = 3 N=3 N=3 时输出 5 5 5

输入格式

一个整数 N N N,表示墙壁的长。

输出格式

输出覆盖方法的最后 4 4 4 位,如果不足 4 4 4 位就输出整个答案。

样例 #1

样例输入 #1

13

样例输出 #1

3465

提示

数据保证, 1 ≤ N ≤ 1000000 1\leq N\leq 1000000 1N1000000

关键点就是,想到怎么表示状态,f状态,k状态
f状态:

00..0
00..0

k状态:

00..0
00..

f状态怎么推出来,k状态怎么推出来,能想到这两个状态,其他的就好办了

状态表示,状态递推

// Problem: P1990 覆盖墙壁
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1990
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2024-03-25 17:56:53
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
#define endl '\n'
#define int int64_t
#define ld long double
using namespace std;
int dx[] = { -1,0,1,0 };
int dy[] = { 0,1,0,-1 };
const int NC = 2e3 + 10;
char ches[NC][NC];
const int mod = 1e4;
const int N = 1e6 + 10;
int a[N], b[N], n, m;
int f[N],k[N];
void solve() {
	cin >> n;
	f[1] = 1; f[2] = 2;
	k[2] = 1;
	for (int i = 3; i <= n; ++i) {
		f[i] = (f[i - 1] + f[i - 2] + 2 * k[i - 1]) % mod;
		k[i] = (f[i - 2] + k[i - 1]) % mod;
	}
	cout << f[n] << endl;
}
signed main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int t = 1;
	//cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值