链接
设 (x) 到 (y) 上的点按序为 (a_1,a_2,cdots ,a_k),则 (ans(x,y)=sumlimits_{i=1}^{n-1}{ans(a_i,a_{i+1})}) 。
所以需要求出 (f_i) : (i) 到 (fa_i) 的 期望步数, (g_i) : (fa_i) 到 (i) 的期望步数。
(f_u=frac{1}{deg_u}+sumlimits_{v in son_u}{frac{f_v+f_u+1}{deg_u}})
( herefore f_u=deg_u+sumlimits_{v in son_u}{f_v})
(g_u=frac{1}{deg_{fa_u}}+frac{g_{fa_u}+g_u+1}{deg_{fa_u}}+sumlimits_{v in son_{fa_u},v ot= u}{frac{f_v+g_u+1}{deg_{fa_u}}})
( herefore g_u=deg_{fa_u}+g_{fa_u}+sumlimits_{v in son_{fa_u},v ot= u}{f_v})
#include<bits/stdc++.h>
#define IL inline
#define LL long long
using namespace std;
const int N=1e5+3,p=1e9+7;
struct hh{
int to,nxt;
}e[N<<1];
int n,m,num,fir[N],f[N],g[N],fa[N],son[N],siz[N],dep[N],deg[N],dis1[N],dis2[N],top[N];
IL int in(){
char c;int f=1;
while((c=getchar())<'0'||c>'9')
if(c=='-') f=-1;
int x=c-'0';
while((c=getchar())>='0'&&c<='9')
x=x*10+c-'0';
return x*f;
}
IL void add(int x,int y){e[++num]=(hh){y,fir[x]},fir[x]=num;}
IL int mod(int x){return x>=p?x-p:x;}
void dfs1(int u,int F){
fa[u]=F,dep[u]=dep[F]+1,siz[u]=1,f[u]=deg[u];
for(int i=fir[u],v;v=e[i].to;i=e[i].nxt)
if(v^F){
dfs1(v,u),siz[u]+=siz[v],f[u]=mod(f[u]+f[v]);
if(siz[son[u]]<siz[v]) son[u]=v;
}
}
void dfs2(int u,int fa){
int sum=0;
for(int i=fir[u],v;v=e[i].to;i=e[i].nxt)
if(v^fa) sum=mod(sum+f[v]);
for(int i=fir[u],v;v=e[i].to;i=e[i].nxt)
if(v^fa) g[v]=mod(deg[u]+mod(g[u]+mod(sum-f[v]+p))),dfs2(v,u);
}
void dfs3(int u,int fa,int t){
top[u]=t,dis1[u]=mod(dis1[fa]+f[u]),dis2[u]=mod(dis2[fa]+g[u]);
if(son[u]) dfs3(son[u],u,t);
for(int i=fir[u],v;v=e[i].to;i=e[i].nxt)
if(v^fa&&v^son[u]) dfs3(v,u,v);
}
IL int get_lca(int x,int y){
while(top[x]^top[y]) dep[top[x]]<dep[top[y]]?y=fa[top[y]]:x=fa[top[x]];
return dep[x]<dep[y]?x:y;
}
int main()
{
int x,y,z;
n=in(),m=in();
for(int i=1;i<n;++i)
x=in(),y=in(),++deg[x],++deg[y],
add(x,y),add(y,x);
dfs1(1,0),f[1]=0,dfs2(1,0),dfs3(1,0,1);
while(m--){
x=in(),y=in(),z=get_lca(x,y);
printf("%d
",mod(mod(dis1[x]-dis1[z]+p)+mod(dis2[y]-dis2[z]+p)));
}
return 0;
}