제출 #1300930

#제출 시각아이디문제언어결과실행 시간메모리
1300930MuhammadSaramŠarenlist (COCI22_sarenlist)C++20
110 / 110
5 ms588 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int mod = 1e9 + 7, M = 61; int dep[M], par[M]; vector<int> nei[M]; void dfs(int u) { for (int i:nei[u]) if (i!=par[u]) par[i]=u, dep[i]=dep[u]+1, dfs(i); } int lca(int u,int v) { if (dep[u]>dep[v]) swap(u,v); while (dep[v]>dep[u]) v=par[v]; while (u!=v) u=par[u], v=par[v]; return u; } signed main() { int n,m,k; cin>>n>>m>>k; int ans=1, pw[n];pw[0]=1; for (int i=1;i<n;i++) { int u,v; cin>>u>>v; nei[u].push_back(v); nei[v].push_back(u); ans=ans*k%mod, pw[i]=ans; } dfs(1); int msk[m]={}; for (int i=0;i<m;i++) { int u,v; cin>>u>>v; int p=lca(u,v); while (u!=p) msk[i]|=(1ll<<u), u=par[u]; while (v!=p) msk[i]|=(1ll<<v), v=par[v]; } for (int ms=1;ms<(1<<m);ms++) { int y=ms, uni=0, now=1; while (y) { bool in=0; for (int p=0;p<m;p++) if (y>>p&1) { if (uni&msk[p]) uni|=msk[p], in=1, y-=(1<<p); } if (!in) { for (int p=0;p<m;p++) if (y>>p&1) { uni|=msk[p], now=now*k%mod; break; } } } int z=n-1-__builtin_popcountll(uni); ans+=pw[z]*now%mod; if (__builtin_popcount(ms)%2) ans-=2*pw[z]*now%mod; ans=(ans+mod*2)%mod; } cout<<ans<<endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...