Description
一个级别为 (1) 的 RDB
是一个单独的节点。
接着,对于所有 (i > 1),级别为 (i) 的 RDB
的构成方法如下。
先求出级别为 (i-1) 的 RDB
,然后对于该 RDB
中的每个节点 (x)。
- 如果 (x) 没有孩子,那么给他加上一个孩子。
- 如果 (x) 只有一个孩子,那么给他加上两个孩子。
- 如果 (x) 已经有了超过一个孩子,那么我们跳过节点 (x)。
接下来,我们定义一个 claw
(见下图),它也是一棵具有特殊性质的树,并且将节点 (1) 称为这个 claw
的中心,其他的称为底部节点。
现在,给出一个级别为 (n) 的 RDB
,初始时他上面的所有节点都为绿色,你可以进行一些操作。
对于每次操作,你需要在给出的 RDB
中找到一个 claw
,满足所有底部节点在 RDB
中都是中心节点的儿子,且这四个节点在 RDB
中都是绿色。然后将这四个节点染为黄色。
问最多可以将多少个节点染成黄色。
Solution
容易找到一个递推关系,(n) 阶树的根结点的三个子节点对应的子树,其分别为 (n-1,n-2,n-2) 阶的树,并且,当 (3|n) 时,根结点时被选择的,其它情况下根结点是不被选择的。
因此我们很容易得到递推关系 (f_n = f_{n-1} + 2f_{n-2} + 4[3|n])
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e+6+5;
const int M = 1e+3+5;
const int mod1 = 1e+9+7;
const int mod2 = 998244353;
#define dbg(x) cerr<<#x<<":"<<x<<endl
int f[N];
void presolve()
{
f[0]=0;
f[1]=0;
f[2]=0;
for(int i=3;i<N;i++)
{
f[i]=(f[i-1]+2*f[i-2]+4*(i%3==0))%mod1;
}
}
void solve()
{
int n;
cin>>n;
cout<<f[n]<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
presolve();
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}