Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int MOD=1e9+7;
- vector <int> v[61];
- struct mazan
- {
- int a,b,l;
- } q[16];
- int tata[61];
- int nivel[61],smen[61],m;
- bool marc[16];
- bool viz[61];
- unordered_map <long long,bool> harta;
- bool leg[16][16];
- int lca(int a,int b)
- {
- if(nivel[a]>nivel[b])
- swap(a,b);
- while(nivel[b]>nivel[a])
- b=tata[b];
- while(a!=b)
- {
- a=tata[a];
- b=tata[b];
- }
- return a;
- }
- void dfs(int nod,int papa)
- {
- tata[nod]=papa;
- nivel[nod]=nivel[papa]+1;
- for(auto it:v[nod])
- if(it!=papa)
- dfs(it,nod);
- }
- void dfsupd(int nod,int papa)
- {
- for(auto it:v[nod])
- if(it!=papa)
- {
- dfsupd(it,nod);
- smen[nod]+=smen[it];
- }
- }
- int lgput(int a,int b)
- {
- int rez=1;
- while(b)
- {
- if(b%2)
- rez=1LL*rez*a%MOD;
- a=1LL*a*a%MOD;
- b/=2;
- }
- return rez;
- }
- void dfsmuch(int a,int val)
- {
- marc[a]=1;
- for(int i=0; i<m; i++)
- if(val&(1<<i)&&leg[a][i+1]&&!marc[i+1])
- dfsmuch(i+1,val);
- }
- bool dointersec(int a,int b,int c,int d)
- {
- if(a==b||c==d)
- return 0;
- if(nivel[a]<=nivel[d]||nivel[c]<=nivel[b])
- return 0;
- int ca=a,cc=c;
- while(nivel[a]>nivel[d]+1)
- a=tata[a];
- while(nivel[c]>nivel[d]+1)
- c=tata[c];
- int ok=(a==c);
- a=ca;
- c=cc;
- while(nivel[a]>nivel[b]+1)
- a=tata[a];
- while(nivel[c]>nivel[b]+1)
- c=tata[c];
- ok&=(a==c);
- return ok;
- }
- int main()
- {
- #ifdef HOME
- freopen("test.in","r",stdin);
- freopen("test.out","w",stdout);
- #endif
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- cout.tie(NULL);
- int n,i,a,b,k,j;
- cin>>n>>m>>k;
- for(i=1; i<n; i++)
- {
- cin>>a>>b;
- v[a].push_back(b);
- v[b].push_back(a);
- }
- dfs(1,0);
- for(i=1; i<=m; i++)
- {
- cin>>q[i].a>>q[i].b;
- q[i].l=lca(q[i].a,q[i].b);
- }
- for(i=1; i<=m; i++)
- for(j=i+1; j<=m; j++)
- leg[i][j]=leg[j][i]=(dointersec(q[i].a,q[i].l,q[j].a,q[j].l)|dointersec(q[i].a,q[i].l,q[j].b,q[j].l)|dointersec(q[i].b,q[i].l,q[j].b,q[j].l)|dointersec(q[i].b,q[i].l,q[j].a,q[j].l));
- int rez=lgput(k,n-1);
- for(i=1; i<(1<<m); i++)
- {
- int cnt=0,cate=0;
- for(j=1; j<=n; j++)
- smen[j]=0;
- for(j=1; j<=m; j++)
- marc[j]=0;
- for(j=0; j<m; j++)
- if(i&(1<<j))
- {
- cate++;
- smen[q[j+1].a]++;
- smen[q[j+1].b]++;
- smen[q[j+1].l]-=2;
- }
- int nrpart=0;
- for(j=0; j<m; j++)
- if(i&(1<<j)&&!marc[j+1])
- {
- dfsmuch(j+1,i);
- nrpart++;
- }
- dfsupd(1,0);
- for(j=1; j<=n; j++)
- if(smen[j])
- cnt++;
- if(cate%2)
- rez=(rez-lgput(k,n-1-cnt+nrpart)+MOD)%MOD;
- else
- rez=(rez+lgput(k,n-1-cnt+nrpart))%MOD;
- }
- cout<<rez;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement