Codeforces Round #652 (Div. 2)D. TediousLee 推导

题意:

Rooted Dead Bush (RDB) of level 1是只有一个点,如下图

当(RDB) of level i变成(RDB) of level i+1的时候,每一个顶点要进行下面的变化:

1、如果一个节点只有一个子节点,那么就再给这个节点添加两个子节点

2、如果一个节点没有子节点,那么就给这个节点添加一个子节点

3、如果一个节点有三个子节点,那么就不用管它

你需要从(RDB) of level i中找到有多少爪,爪的结构如下

最后因为我们求的是要给多少爪的节点染色,因为一个爪有四个节点,所以最后答案就是爪的个数乘于4(注意,爪与爪之间不能有重叠节点)

 对于(RDB) of level 3只有一个爪就是(1,3,2,4);对于(RDB) of level 4种有两个爪(1,3,2,4)和(2,7,5,6)但是两个爪有重叠部分,所以只能算作一个

题解:

衍生的过程是具有重复性的,最终变化的是根结点 1 下的三棵子树,左右两棵子树为 leveln-2,中间的子树为 leveln-1 。

因为 level1 和 level2 的根结点并未使用,所以可以在 level3 中选择以根结点 1 为中心的爪形结构。

同理,level4level5 可以通过选取较下层的爪形结构来避免根结点的使用,所以在 level6 中又可以选取以根结点 1 为中心的爪形结构。

即,level为 3 的倍数的图形都可以再额外选取位于根结点的爪形结构。

dp[i]=2*dp[i-2]+dp[i-1]+(i%3==0)*4

代码:

 1 #include<iostream>
 2 using namespace std;
 3 #define ll long long
 4 const int maxn =( 2 * 1e6)+10;
 5 const int mod = 1e9 + 7;
 6 ll dp[maxn], i, t, n;
 7 
 8 void solve()
 9 {
10     dp[0] = 0;
11     dp[1] = 0;
12     dp[2] = 0;
13     for (int i = 3; i <maxn; i++)
14     {
15         dp[i] = (dp[i - 1] + 2 * dp[i - 2])%mod;
16         if (i % 3 == 0)  
17         {
18             dp[i] += 4;
19             dp[i] %= mod;
20         }
21     }
22 }
23 int main()
24 {
25     solve();
26     int t;
27     cin >> t;
28     while (t--)
29     {
30         int n;
31         cin >> n;
32         cout << dp[n] << endl;
33     }
34 }
原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/13236433.html