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;
}