P8784 [蓝桥杯 2022 省 B] 积木画
Infinite_Eternity · · 题解
Description
P8784 [蓝桥杯 2022 省 B] 积木画
用
数据范围:
Analysis
首先,我们定义
考虑最后放的情况:
-
放
1 个\text{I} 型积木(竖放):方案数为F_{n-1} ;(如\small\text{图1} ) -
放
2 个\text{I} 型积木(横放):方案数为F_{n-2} ;(如\small\text{图2} ) -
放
1 个\text{L} 型积木(因为该积木可以翻转着放,所以这样放的总方案数要 乘2 ):然而,这么填会突出1 个格子,如何消去这个突出?- 再放
1 个\text{L} 型积木,恰好消去突出,方案数F_{n-3} ;(如\small\text{图3\,-\,1} ) - 横放
1 个\text{I} 型积木,再放\text{L} 型积木,方案数F_{n-4} ;(如\small\text{图3\,-\,2} ) -
- 直到
\text{I} 型积木和\text{L} 型积木恰好填满画布(F_0 )。
- 再放
综上,最后放
综合
我们令
再令
上式减去下式,得:
移项得:
于是化简得:
Code
#include <stdio.h>
const int mod = 1e9+7,N = 1e7;
int main()
{
int f[N]={0,1,2,5};
int n;
scanf("%d",&n);
for(int i=4;i<=n;++i)
f[i] = (2*f[i-1]%mod+f[i-3]%mod)%mod;
printf("%d",f[n]);
return 0;
}