Submission #1185770

#TimeUsernameProblemLanguageResultExecution timeMemory
1185770asli_bgŠarenlist (COCI22_sarenlist)C++20
20 / 110
1 ms396 KiB
#include <bits/stdc++.h> using namespace std; #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; #define int long long typedef pair<int,int> pii; typedef vector<int> vi; typedef vector<pii> vii; typedef vector<bool> vb; typedef tree<pii,null_type,less<pii>,rb_tree_tag, tree_order_statistics_node_update> oset; #define fi first #define se second #define pb push_back #define mid (l+r)/2 #define all(x) x.begin(),x.end() #define FOR(i,a) for(int i=0;i<(a);i++) #define FORE(i,a,b) for(int i=(a);i<(b);i++) #define cont(x) for(auto el:x) cout<<el<<' ';cout<<endl; #define contp(x) for(auto el:x) cout<<el.fi<<'-'<<el.se<<' ';cout<<endl; #define sp <<" "<< #define DEBUG(x) cout<<(#x) sp x<<endl #define carp(a,b) (((a%MOD)*(b%MOD))%MOD) #define topla(a,b) (((a%MOD)+(b%MOD))%MOD) const int INF=1e18; const int MAXN=65; const int MAXK=10; const int MOD=1e9+7; int n,m,k; vii adj[MAXN]; int up[MAXN][MAXK]; int dep[MAXN]; pii p[MAXN]; void dfs(int nd,int ata,int h){ dep[nd]=h; for(auto [kom,ind]:adj[nd]){ if(kom==ata) continue; p[kom]={nd,ind}; dfs(kom,nd,h+1); } } void calc(){ memset(up,-1,sizeof up); FORE(i,1,n+1){ up[i][0]=p[i].fi; } FORE(j,1,MAXK){ FORE(i,1,n+1){ if(up[i][j-1]==-1) continue; up[i][j]=up[up[i][j-1]][j-1]; } } } int lca(int a,int b){ //a altta olan, b üstte olan if(dep[a]<dep[b]) swap(a,b); for(int i=MAXK-1;i>=0;i--){ int tt=up[a][i]; if(tt==-1) continue; if(dep[tt]>=dep[b]) a=tt; } if(a==b) return a; for(int i=MAXK-1;i>=0;i--){ int bir=up[a][i]; int iki=up[b][i]; if(bir==-1 or iki==-1) continue; if(bir!=iki){ a=bir; b=iki; } } return up[a][0]; } int exp(int x,int us){ int res=1; while(us>0){ if(us&1) res=carp(res,x); x=carp(x,x); us/=2; } return res; } int comp,edg; int used[MAXN]; bool vis[MAXN][MAXN]; signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m>>k; FOR(i,n-1){ int a,b; cin>>a>>b; adj[a].pb({b,i}); adj[b].pb({a,i}); } p[1]={-1,-1}; dfs(1,-1,0); calc(); vector<pair<pii,int>> tut; FOR(i,m){ int a,b; cin>>a>>b; if(dep[a]<dep[b]) swap(a,b); //a altta olan tut.pb({{a,b},lca(a,b)}); } int ans=exp(k,n-1); for(int i=1;i<(1<<m);i++){ int say=0; FOR(j,n-1) used[j]=false; FOR(j,m){ FOR(t,m){ vis[j][t]=false; } } edg=comp=0; for(int bt=0;bt<m;bt++){ if(i&(1<<bt)){ bool f=true; int ata=tut[bt].se; int x=tut[bt].fi.fi; while(x!=ata){ if(!used[p[x].se]) edg++; else{ if(!vis[bt][used[p[x].se]]){ vis[bt][used[p[x].se]]=true; vis[used[p[x].se]][bt]=true; comp--; } } used[p[x].se]=bt; x=p[x].fi; } x=tut[bt].fi.se; while(x!=ata){ if(!used[p[x].se]) edg++; else{ if(!vis[bt][used[p[x].se]]){ vis[bt][used[p[x].se]]=true; vis[used[p[x].se]][bt]=true; comp--; } } used[p[x].se]=bt; x=p[x].fi; } say++; comp++; } } int kalan=n-1-edg+comp; int deg=exp(k,kalan); //cout<<"here" sp edg sp comp sp kalan sp deg sp i sp say<<endl; if(say%2==0) ans=topla(ans,deg); else ans=topla(ans,MOD-deg); } cout<<ans<<endl; }
#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...