Codeforces Round #652 (Div. 2) D TediousLee(动态规划 题解)

Lee tried so hard to make a good div.2 D problem to balance his recent contest, but it still doesn’t feel good at all. Lee invented it so tediously slow that he managed to develop a phobia about div.2 D problem setting instead. And now he is hiding behind the bushes…

Let’s define a Rooted Dead Bush (RDB) of level n as a rooted tree constructed as described below.

A rooted dead bush of level 1 is a single vertex. To construct an RDB of level i we, at first, construct an RDB of level i−1, then for each vertex u:

  1. if u has no children then we will add a single child to it;
  2. if u has one child then we will add two children to it;
  3. if u has more than one child, then we will skip it.
    在这里插入图片描述
    Let’s define a claw as a rooted tree with four vertices: one root vertex (called also as center) with three children. It looks like a claw:
    在这里插入图片描述
    Lee has a Rooted Dead Bush of level n. Initially, all vertices of his RDB are green.

In one move, he can choose a claw in his RDB, if all vertices in the claw are green and all vertices of the claw are children of its center, then he colors the claw’s vertices in yellow.

He’d like to know the maximum number of yellow vertices he can achieve. Since the answer might be very large, print it modulo 109+7.

Input
The first line contains one integer t ( 1 ≤ t ≤ 1 0 4 ) t (1≤t≤10^4) t(1t104) — the number of test cases.

Next t lines contain test cases — one per line.

The first line of each test case contains one integer n ( 1 ≤ n ≤ 2 ⋅ 1 0 6 ) (1≤n≤2⋅10^6) (1n2106) — the level of Lee’s RDB.

Output
For each test case, print a single integer — the maximum number of yellow vertices Lee can make modulo 1 0 9 + 7 10^9+7 109+7.
Example:
input:
7
1
2
3
4
5
100
2000000

output:
0
0
4
4
12
990998587
804665184
Note
It’s easy to see that the answer for RDB of level 1 or 2 is 0.

The answer for RDB of level 3 is 4 since there is only one claw we can choose: {1,2,3,4}.

The answer for RDB of level 4 is 4 since we can choose either single claw {1,3,2,4} or single claw {2,7,5,6}. There are no other claws in the RDB of level 4 (for example, we can’t choose {2,1,7,6}, since 1 is not a child of center vertex 2).

在这里插入图片描述
题解:注意理解题意。
题目关键是3种构建规

  1. 没有点的,加上一个点
  2. 有一个点的,加上两个点
  3. 有两个以上的点的, 跳过
    在这里插入图片描述
    因此 根节点不取的情况下,取子节点为爪 d p [ i ] = d p [ i − 1 ] + 2 ∗ d p [ i − 2 ] dp[i]=dp[i-1]+2*dp[i-2] dp[i]=dp[i1]+2dp[i2]
    当子节点不能为爪的情况下,取根结点,此时 i整除3.
    d p [ i ] = d p [ i − 1 ] + 2 ∗ d p [ i − 2 ] + 4 dp[i]=dp[i-1]+2*dp[i-2]+4 dp[i]=dp[i1]+2dp[i2]+4
#include<iostream> 
using namespace std;
#define ll long long 
const int maxn =( 2 * 1e6)+10; 
const int mod = 1e9 + 7;
ll dp[maxn], i, t, n;
//打表
void solve() {
	dp[0] = 0;
	dp[1] = 0;
	dp[2] = 0;
	for (int i = 3; i <maxn; i++) {
		dp[i] = (dp[i - 1] + 2 * dp[i - 2])%mod;
		if (i % 3 == 0) {//如果满足,这子节点不能构成树
			dp[i] += 4;
			dp[i] %= mod;
		}
	}
}
int main() {
	solve();
	int t;
	cin >> t;
	while (t--) {
		int n;
		cin >> n;
		cout << dp[n] << endl;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值