#include #define ci const int #define ll long long using namespace std; int read(){ char ch=getchar(); int res=0; while(ch<'0'||ch>'9')ch=getchar(); while(ch>='0'&&ch<='9')res=(res<<1)+(res<<3)+(ch^48),ch=getchar(); return res; } ci N=1e5+5,mod=1e9+7; inline void add(int &x,ci v){ x+=v,x-=x>=1; } return ans; } int fac[N],dfac[N],inv[N]; int n,k,x[N],y[N],deg[N],ans,tn[N]; int head[N],nx[N<<1],to[N<<1],id[N<<1],tot; int f[N];//子树内有的方案数 bool h[N]; void Init(){ for(int i=1;i<=n;++i){ deg[i]=0; head[i]=0; h[i]=0; f[i]=0; } tot=0; } void add(ci x,ci y,ci i){ to[++tot]=y,nx[tot]=head[x],head[x]=tot,id[tot]=i; } void dfs(ci x,ci fa){ f[x]=0; int g=0,t=0; for(int i=head[x],y;i;i=nx[i]){ if((y=to[i])==fa)continue; dfs(y,x); if(h[id[i]]){//choose sub(g,(ll)f[x]*(1+f[y])%mod);//two sub(t,f[y]);//one } add(g,(ll)f[x]*f[y]%mod);//not choose if(h[id[i]]){//choose sub(f[x],(1+f[y])%mod); } add(f[x],f[y]);//not choose } g=(ll)g*tn[x]%mod; add(ans,g); add(ans,t); f[x]=(ll)f[x]*tn[x]%mod; } void Work(){ n=read(),k=read(); for(int i=1;i=2)tn[i]=(ll)dfac[deg[i]-1]*fac[deg[i]-2]%mod; for(int i=1;i<=k;++i)h[read()]=1; ans=0; dfs(1,0); ans=(mod-ans)%mod; int t=1; for(int i=1;i<=n;++i)t=(ll)t*fac[deg[i]-1]%mod; ans=(ll)ans*t%mod; add(ans,(ll)k*t%mod); printf("%d\n",ans); } int main(){ freopen("traverse.in","r",stdin); freopen("traverse.out","w",stdout); fac[0]=fac[1]=dfac[0]=dfac[1]=inv[1]=1; for(int i=2;i