rt,还没写第二问,第一问只有 2/10。不知道哪里错了。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int M=1e9+7;
inline int qp(int a,int x){
int res=1;
while(x){
if(x&1)res=res*a%M;
a=a*a%M;
x>>=1;
}
return res;
}
inline int inv(int x){
return qp(x,M-2);
}
int l[210],r[210],p[210],f[210];
vector<int>T;
int n,k;
vector<int>g[210];
inline void mk(int L,int R){
for(int i=1;i<=n;i++)
p[i]=max(0ll,min(r[i],R)-max(l[i],L)+1);
}
inline void add(int &x,int y){
x+=y;
if(x>=M)x-=M;
}
inline void dfs1(int u,int fa){
f[u]=1;
for(int v:g[u])
if(v!=fa)dfs1(v,u),add(f[u],f[v]);
f[u]=f[u]*p[u]%M;
}
inline void dfs2(int u,int fa){
if(fa)add(f[u],(f[fa]-f[u]*p[fa]%M+M)*p[u]%M);
for(int v:g[u])
if(v!=fa)dfs2(v,u);
}
int ANS;
const int I2=inv(2);
inline int calc1(int L,int R){
mk(L,R);
dfs1(1,0);
dfs2(1,0);
int res=0;
for(int i=1;i<=n;i++)add(res,(f[i]+p[i])*I2%M);
return res;
}
inline int LAG(int n,int *x,int *y,int X){
int res=0;
for(int i=0;i<=n;i++){
int cntfz=1,cntfm=1;;
for(int j=0;j<=n;j++)
if(i!=j)
cntfz=cntfz*(X-x[j]+M)%M,
cntfm=cntfm*(x[i]-x[j]+M)%M;
add(res,y[i]*cntfz%M*inv(cntfm)%M);
}
return res;
}
int x[210],y[210];
inline int CALC1(int L,int R){
int p=n+5;
int pre=0;
for(int i=L;i<=L+p;i++)
x[i-L]=i,y[i-L]=(pre+=calc1(i,i+k))%M;
return LAG(p,x,y,R);
}
inline void ins(int x){
if(x<=0)return ;
T.push_back(x);
}
signed main(){
// freopen("tree.in","r",stdin);
// freopen("tree.out","w",stdout);
ios::sync_with_stdio(0);
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>l[i]>>r[i];
ins(l[i]);
ins(r[i]);
}
T.push_back(1e9);
T.push_back(1e9+1);
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
sort(T.begin(),T.end());
T.resize(unique(T.begin(),T.end())-T.begin());
int res1=0;
int lst=0;
for(int x:T){
if(x==1e9+1)continue;
add(res1,CALC1(lst+1,x));
lst=x;
}
lst=1;
k--;
for(int x:T){
if(x<=lst)continue;
add(res1,M-CALC1(lst+1,x));
lst=x;
}
cout<<res1<<endl;
cout<<0<<endl;
return 0;
}