#include<bits/stdc++.h>
using namespace std;
#define int long long
#pragma GCC optimize("O3,unroll-loops")
const int maxn=3e5;
const int mod=1e9+7;
int pang(int a,int b){
if(b==0)return 1;
int tmp=pang(a,b/2);
if(b%2==0)return (tmp*tmp)%mod;
else return (((tmp*tmp)%mod)*a)%mod;
}
int n,qu;
vector<int>adj[maxn+2];
int bin[maxn+2][20],dep[maxn+2];
void dfs(int cur,int par){
bin[cur][0]=par;
dep[cur]=dep[par]+1;
for(auto x : adj[cur]){
if(x==par)continue;
dfs(x,cur);
}
}
int lca(int u,int v){
if(dep[u]<dep[v])swap(u,v);
int slsh=dep[u]-dep[v];
for(int q=19;q>=0;q--){
if(slsh>=(1<<q)){
slsh-=(1<<q);
u=bin[u][q];
}
}
if(u==v)return u;
for(int q=19;q>=0;q--){
if(bin[u][q]!=bin[v][q]){
u=bin[u][q];
v=bin[v][q];
}
}
return bin[u][0];
}
int dsu[2*maxn+2];
int fin(int a){
if(dsu[a]==a)return a;
return dsu[a]=fin(dsu[a]);
}
void merg(int a,int b){
a=fin(a); b=fin(b);
if(a==b)return ;
dsu[a]=b;
}
int naik[2*maxn+2];
int fin2(int a){
if(naik[a]==a)return a;
return naik[a]=fin(naik[a]);
}
void merg2(int a,int b){
a=fin2(a); b=fin2(b);
if(a==b)return ;
if(dep[a]<dep[b])swap(a,b);
naik[a]=b;
}
signed main(){
cin>>n>>qu;
for(int q=1;q<n;q++){
int u,v;
cin>>u>>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
for(int q=1;q<=2*n;q++){
dsu[q]=q;
naik[q]=q;
}
dfs(1,0);
for(int q=1;q<20;q++){
for(int w=1;w<=n;w++){
bin[w][q]=bin[bin[w][q-1]][q-1];
}
}
for(int q=1;q<=qu;q++){
int u,v;
cin>>u>>v;
int root=lca(u,v);
u=fin2(u);
while(dep[u]-dep[root]>=2){
merg(u,bin[u][0]);
merg(u+n,bin[u][0]+n);
merg2(u,bin[u][0]);
u=fin2(u);
}
v=fin2(v);
while(dep[v]-dep[root]>=2){
merg(v,bin[v][0]);
merg(v+n,bin[v][0]+n);
merg2(v,bin[v][0]);
v=fin2(v);
}
if(root==u || root==v)continue;
merg(u,v+n);
merg(v,u+n);
}
for(int q=1;q<=n;q++){
if(fin(q)==fin(n+q)){
cout<<0<<endl;
return 0;
}
}
int cc=1;
for(int q=1;q<=2*n;q++){
if(fin(q)==q)cc++;
}
cc-=2;
cout<<pang(2,cc/2)<<endl;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |