洛谷 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[n]表示覆盖n*2的墙壁的方案数,接下来讨论F[n]的递推公式。

如果现在已经有(n-1)2的墙壁被覆盖了,那么我们就只能在最后一排添加一个竖着的12瓷砖,即F[n-1]种放法。

如果现在已经有(n-2)*2的墙壁被覆盖了,理论上我们可以添加两个横着的或者两个竖着的,但是我们添加两个竖着的瓷砖的时候,会和在讨论(n-1)*2时的情况产生重复,因此我们只取两个横着的放法,即F[n-2]种放法。

如果现在已经有(n-3)2的墙壁被覆盖了,我们不能取3个12的瓷砖,因为这样的话无论如何摆放,都会和上面已经讨论过的情况产生重复,我们只能取两个弯瓷砖,翻转一下有两种放法,即F[n-3]*2种放法。

以此类推,去掉重复情况后,(n-4)*2即之后都是F[i]*2种方法,因此F[n]=pre(F[n-1])+pre(F[n-3]),其中pre表示前缀和。

整理后F[n]=F[n-1]*2+F[n-3]。

#include <bits/stdc++.h>

int main()
{
    int n;
    std::cin >> n;

    std::vector<int> arr(1000005);
    arr[1] = 1, arr[2] = 2,arr[3] = 5;
    
    for(int i = 4; i <= n; i++)
    {
        arr[i] =(arr[i - 1] * 2 + arr[i - 3]) % 10000;
    }

    std::cout << arr[n] << "\n";

}

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值