# Ostap and Tree

## 题解

$dp_{i,j}$为在节点$i$的子树中，节点$j$是最近的黑点，且距离超过$j$的点都被满足的方案数。

## 源码

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<bitset>
using namespace std;
#define MAXN 105
typedef long long LL;
const LL mo=1e9+7;
typedef pair<LL,LL> pii;
#define gc() getchar()
template<typename _T>
_T f=1;x=0;char s=gc();
while(s>'9'||s<'0'){if(s=='-')f=-1;s=gc();}
while(s>='0'&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=gc();}
x*=f;
}
LL dp[MAXN][MAXN],tmp[MAXN],ans;
struct edge{int v,nxt;}e[MAXN<<1];
void dfs(int x,int fa){
dp[x][0]=dp[x][k+1]=1;
int v=e[i].v;if(v==fa)continue;dfs(v,x);
for(int j=0;j<=2*k;j++)tmp[j]=0;
for(int j1=0;j1<=2*k;j1++)
for(int j2=0;j2<=2*k;j2++)
if(j1+j2<=2*k)(tmp[min(j1,j2+1)]+=dp[x][j1]*dp[v][j2]%mo)%=mo;
else (tmp[max(j1,j2+1)]+=dp[x][j1]*dp[v][j2]%mo)%=mo;
for(int j=0;j<=2*k;j++)dp[x][j]=tmp[j];
}
}
signed main(){
for(int i=1;i<n;i++){
}
dfs(1,0);
for(int i=0;i<=k;i++)(ans+=dp[1][i])%=mo;
printf("%lld\n",ans);
return 0;
}

05-19

12-08 809
11-29 942
12-02 181