div3·881d
给定一棵树,根节点是 1,根节点在最上面,可能有些节点上有苹果,会沿着树链滑下来,问每次给定的两个节点位置上的苹果落下来的位置有多少种组合。
ll dp[NN];
void dfs(ll i,ll pre)
{
if(i!=1&&g[i].size()==1)
{
dp[i]=1;return;
}
for(int j=0;j<g[i].size();j++)
{
if(g[i][j]!=pre)
{
dfs(g[i][j],i);
dp[i]+=dp[g[i][j]];//重点
}
}
}
void solve()
{
ans=0;
cin>>n;
for(int i=0;i<=n;i++)g[i].clear(),dp[i]=0;
for(int i=0;i<n-1;i++)
{
ll u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,0);
cin>>m;
while(m--)
{
cin>>x>>y;
cout<<dp[x]*dp[y]<<"\n";
}
}