제출 #557697

#제출 시각아이디문제언어결과실행 시간메모리
557697status_codingStar Trek (CEOI20_startrek)C++14
30 / 100
1089 ms14828 KiB
#include <bits/stdc++.h> #define mod 1000000007 using namespace std; struct nodS { bool dp; int nrFChild, nrCrit; vector<int> v; }; long long put(long long baza, long long exp) { if(!exp) return 1; long long ans = put(baza, exp/2); ans *= ans; ans %= mod; if(exp % 2) { ans *= baza; ans %= mod; } return ans; } long long n,d; nodS nod[100005]; bool win[100005]; long long nrCrit[100005]; long long dp[100005]; void addChild(int p, int it) { if(!nod[it].dp) { nod[p].nrFChild ++; nod[p].dp = true; } } void dfs(int p, int par) { nod[p].nrFChild = 0; nod[p].nrCrit = 0; for(int it : nod[p].v) { if(it == par) continue; dfs(it, p); addChild(p, it); } nod[p].dp = (nod[p].nrFChild > 0); if(!nod[p].dp) nod[p].nrCrit = 1; else nod[p].nrCrit = 0; for(int it : nod[p].v) { if(it == par) continue; if(nod[p].dp && !nod[it].dp && nod[p].nrFChild == 1) nod[p].nrCrit += nod[it].nrCrit; if(!nod[p].dp && nod[it].dp) nod[p].nrCrit += nod[it].nrCrit; } } int main() { cin>>n>>d; if(n == 2) { cout<<put(n, 2*d); return 0; } for(int i=1;i<n;i++) { int x, y; cin>>x>>y; nod[x].v.push_back(y); nod[y].v.push_back(x); } for(int i=1;i<=n;i++) { dfs(i, 0); win[i] = nod[i].dp; nrCrit[i] = nod[i].nrCrit; } for(int i=1;i<=n;i++) if(!win[i]) dp[i] = 1; for(int i=d-1 ;i>=0; i--) { long long nrF=0; for(int j=1;j<=n;j++) { nrF += dp[j]; nrF %= mod; } long long nrW = put(n, 2*(d-i-1) + 1 ) - nrF + mod; nrW %= mod; //cout<<nrW<<' '<<nrF<<'\n'; for(int j=1;j<=n;j++) { if(!win[j]) { dp[j] = (n - nrCrit[j]) * n; dp[j] %= mod; dp[j] += nrCrit[j] * nrW; dp[j] %= mod; } else { dp[j] = nrCrit[j] * nrF; dp[j] %= mod; } } } cout<<(put(n, 2*d) - dp[1] + mod) % mod; 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...