Advertisement
Anon2005

Untitled

Jan 29th, 2022
1,036
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.11 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MOD=1e9+7;
  4. vector <int> v[61];
  5. struct mazan
  6. {
  7.     int a,b,l;
  8. } q[16];
  9. int tata[61];
  10. int nivel[61],smen[61],m;
  11. bool marc[16];
  12. bool viz[61];
  13. unordered_map <long long,bool> harta;
  14. bool leg[16][16];
  15. int lca(int a,int b)
  16. {
  17.     if(nivel[a]>nivel[b])
  18.         swap(a,b);
  19.     while(nivel[b]>nivel[a])
  20.         b=tata[b];
  21.     while(a!=b)
  22.     {
  23.         a=tata[a];
  24.         b=tata[b];
  25.     }
  26.     return a;
  27. }
  28. void dfs(int nod,int papa)
  29. {
  30.     tata[nod]=papa;
  31.     nivel[nod]=nivel[papa]+1;
  32.     for(auto it:v[nod])
  33.         if(it!=papa)
  34.             dfs(it,nod);
  35. }
  36. void dfsupd(int nod,int papa)
  37. {
  38.     for(auto it:v[nod])
  39.         if(it!=papa)
  40.         {
  41.             dfsupd(it,nod);
  42.             smen[nod]+=smen[it];
  43.         }
  44. }
  45. int lgput(int a,int b)
  46. {
  47.     int rez=1;
  48.     while(b)
  49.     {
  50.         if(b%2)
  51.             rez=1LL*rez*a%MOD;
  52.         a=1LL*a*a%MOD;
  53.         b/=2;
  54.     }
  55.     return rez;
  56. }
  57. void dfsmuch(int a,int val)
  58. {
  59.     marc[a]=1;
  60.     for(int i=0; i<m; i++)
  61.         if(val&(1<<i)&&leg[a][i+1]&&!marc[i+1])
  62.             dfsmuch(i+1,val);
  63. }
  64. bool dointersec(int a,int b,int c,int d)
  65. {
  66.     if(a==b||c==d)
  67.         return 0;
  68.     if(nivel[a]<=nivel[d]||nivel[c]<=nivel[b])
  69.         return 0;
  70.     int ca=a,cc=c;
  71.     while(nivel[a]>nivel[d]+1)
  72.         a=tata[a];
  73.     while(nivel[c]>nivel[d]+1)
  74.         c=tata[c];
  75.     int ok=(a==c);
  76.     a=ca;
  77.     c=cc;
  78.     while(nivel[a]>nivel[b]+1)
  79.         a=tata[a];
  80.     while(nivel[c]>nivel[b]+1)
  81.         c=tata[c];
  82.     ok&=(a==c);
  83.     return ok;
  84. }
  85. int main()
  86. {
  87. #ifdef HOME
  88.     freopen("test.in","r",stdin);
  89.     freopen("test.out","w",stdout);
  90. #endif
  91.     ios_base::sync_with_stdio(false);
  92.     cin.tie(NULL);
  93.     cout.tie(NULL);
  94.     int n,i,a,b,k,j;
  95.     cin>>n>>m>>k;
  96.     for(i=1; i<n; i++)
  97.     {
  98.         cin>>a>>b;
  99.         v[a].push_back(b);
  100.         v[b].push_back(a);
  101.     }
  102.     dfs(1,0);
  103.     for(i=1; i<=m; i++)
  104.     {
  105.         cin>>q[i].a>>q[i].b;
  106.         q[i].l=lca(q[i].a,q[i].b);
  107.     }
  108.     for(i=1; i<=m; i++)
  109.         for(j=i+1; j<=m; j++)
  110.             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));
  111.     int rez=lgput(k,n-1);
  112.     for(i=1; i<(1<<m); i++)
  113.     {
  114.         int cnt=0,cate=0;
  115.         for(j=1; j<=n; j++)
  116.             smen[j]=0;
  117.         for(j=1; j<=m; j++)
  118.             marc[j]=0;
  119.         for(j=0; j<m; j++)
  120.             if(i&(1<<j))
  121.             {
  122.                 cate++;
  123.                 smen[q[j+1].a]++;
  124.                 smen[q[j+1].b]++;
  125.                 smen[q[j+1].l]-=2;
  126.             }
  127.         int nrpart=0;
  128.         for(j=0; j<m; j++)
  129.             if(i&(1<<j)&&!marc[j+1])
  130.             {
  131.                 dfsmuch(j+1,i);
  132.                 nrpart++;
  133.             }
  134.         dfsupd(1,0);
  135.         for(j=1; j<=n; j++)
  136.             if(smen[j])
  137.                 cnt++;
  138.         if(cate%2)
  139.             rez=(rez-lgput(k,n-1-cnt+nrpart)+MOD)%MOD;
  140.         else
  141.             rez=(rez+lgput(k,n-1-cnt+nrpart))%MOD;
  142.     }
  143.     cout<<rez;
  144.     return 0;
  145. }
  146.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement