CF1369D 题解

思路

不难发现,对于一个 lv>2lv>2 的树而言,左右儿子是 lv2lv-2 的,中间儿子是 lv1lv-1 的,这里就放一个 lv=4lv=4 的图(手绘,不喜勿喷 qwq):

然后每隔三层,就会在根节点形成一个与子树的爪不重合的爪,所以状态转移方程如下:

dpi={dpi1+2×dpi2imod30dpi1+2×dpi2+4imod3=0dp_i=\left\{\begin{matrix} dp_{i-1}+2\times dp_{i-2} & i\bmod3\ne0\\ dp_{i-1}+2\times dp_{i-2}+4 & i\bmod3=0 \end{matrix}\right.

另外注意一个爪子有四个点。

代码

# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
const int mod = 1e9 + 7;
int n = 2000003, t, dp[2000005];
int main () {
	ios::sync_with_stdio (0);
	cin.tie (0);
	cout.tie (0);
	for (int i = 3; i < n; ++ i)
		dp[i] = (dp[i - 1] + dp[i - 2] * 2 % mod + (! (i % 3)) * 4) % mod;
	cin >> t;
	while (t --)
		cin >> n, cout << dp[n] << '\n';
	return 0;
}
posted @ 2024-05-30 15:40  Vitamin_B  阅读(11)  评论(0)    收藏  举报  来源