1. 程式人生 > 實用技巧 >Codeforces 1369D TediousLee(遞推/找規律)

Codeforces 1369D TediousLee(遞推/找規律)

題意:高度為 i+1 的一棵 RDC 樹可以由高度為 i 的一棵 RDC 樹通過這樣的規則構造出來:在高度為 i 的 RDC 中,對於只有一個孩子的節點,加上兩個孩子節點,沒有孩子的節點加上一個節點。問你高度為 h 的 RDC 樹有多少個互不重疊的爪型的節點。

題解:高度為n的樹,可以由一個高度為n-1的樹加上兩個n-2的樹加一個根節點構成,直接遞推,注意就是先取下層的,在取上層的,當n-1和n-2的根節點都沒有取的時候,可以在最高層在加一個爪子。

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define
fre freopen("C:\\in.txt", "r", stdin) #define _for(i,a,b) for(int i=a; i< b; i++) #define _rep(i,a,b) for(int i=a; i<=b; i++) #define lowbit(a) ((a)&-(a)) #define inf 0x3f3f3f3f #define endl "\n" using namespace std; typedef long long ll; template <class T> void read(T &x) {
char c; bool op=0; while(c=getchar(), c<'0'||c>'9') if(c=='-') op=1; x=c-'0'; while(c=getchar(), c>='0'&&c<='9') x=x*10+c-'0'; if(op) x=-x; } const int maxn=2e6+5; const int mod=1e9+7; ll T, n, f[maxn], used[maxn]; void pre_solve() { f[1]=f[2]=0; _rep(i, 3, maxn){
if(!used[i-1] && !used[i-2]) used[i]=true; f[i]=f[i-1]+2*f[i-2]+used[i]; f[i]%=mod; } } int main() { //fre; pre_solve(); read(T); while(T--) { read(n); printf("%lld\n", f[n]*4%mod); } return 0; }