https://codeforces.com/problemset/problem/1369/D
一眼结论,从这棵树从下往上,能取就取,肯定能得到最大值,因为儿子数量更多一些,如果取父节点会影响很多子树。
然后再考虑,i=3,只能取跟节点的1个爪子,i=4的时候,从下往上取,取中间的爪子,根节点不会被取,i=5的时候,也不会取根节点
然后可以发现 对于level i , 由3棵子树+1个根节点形成,其中2棵i-2的树,1棵i-1的树
那么如果i-2和i-1都不取根节点,也就是i的根节点的子节点,那么根节点这里就可以在子树都取完最大值的基础上多取一个爪子。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=2e6+10;
const int mod=1e9+7;
int n,m,cas,k,cnt,tot,ans;
char s[maxl];
bool in[maxl];
ll dp[maxl];
inline void prework()
{
scanf("%d",&n);
}
inline void mainwork()
{
}
inline void print()
{
printf("%lld\n",4*dp[n]%mod);
}
int main()
{
dp[1]=0;dp[2]=0;dp[3]=1;
for(int i=4;i<maxl;i++)
if(i%3==0)
dp[i]=(2*dp[i-2]+dp[i-1]+1)%mod;
else
dp[i]=(2*dp[i-2]+dp[i-1])%mod;
int t=1;
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}