Submission #1185672

#TimeUsernameProblemLanguageResultExecution timeMemory
1185672UnforgettableplStar Trek (CEOI20_startrek)C++20
78 / 100
428 ms51824 KiB
#pragma GCC optimize("Ofast","unroll-loops") #include <bits/stdc++.h> using namespace std; #define int long long const int modulo = 1e9+7; int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int N,D; cin >> N >> D; vector<vector<int>> adj(N+1); for(int i=1;i<N;i++){ int a,b;cin>>a>>b; adj[a].emplace_back(b); adj[b].emplace_back(a); } vector DPbase(N+1,vector<int>(4)); vector DPend(N+1,vector<int>(4)); vector<int> sumzero(N+1),sumone(N+1),cntzero(N+1); auto calc = [&](int x){ pair<int,int> ans; if(cntzero[x]){ ans.first = 0; if(cntzero[x]==1)ans.second=sumzero[x]; else ans.second = 0; } else { ans.first = 1; ans.second=sumone[x]; } return ans; }; auto modify = [&](int x,int y,int offset){ auto t = calc(y); if(t.first){cntzero[x]+=offset;sumzero[x]+=t.second*offset;} else sumone[x]+=t.second*offset; }; function<pair<int,int>(int,int)> dfs = [&](int x,int p){ sumone[x]++; for(int&i:adj[x])if(i!=p){ auto t = dfs(i,x); if(t.first){cntzero[x]++;sumzero[x]+=t.second;} else sumone[x]+=t.second; } return calc(x); }; function<void(int,int)> calcDFS = [&](int x,int p){ if(p)modify(x,p,1); auto t = calc(x); if(t.first==0){ DPbase[x][2]=N-t.second; DPbase[x][0]=t.second; DPend[x][2]=1; } else { DPbase[x][3]=N-t.second; DPbase[x][1]=t.second; DPend[x][3]=1; } for(int&i:adj[x])if(i!=p){ modify(x,i,-1); calcDFS(i,x); modify(x,i,1); } if(p)modify(x,p,-1); }; dfs(1,0); calcDFS(1,0); DPbase[0][0]=1; DPend[0][0]=-1; auto binexpo = [&](int x,int p){ if(p==-2)return x; int ans = 1; while(p){ if(p&1){ ans*=x; ans%=modulo; } p/=2; x*=x; x%=modulo; } return ans; }; auto combine = [&](vector<vector<int>> &DP1,vector<vector<int>> &DP2){ vector DP(N+1,vector<int>(4)); vector<int> sums(4); for(int i=1;i<=N;i++){ for(int j=0;j<4;j++){ sums[j]+=DP2[i][j]; } } for(int i=0;i<4;i++)sums[i]%=modulo; for(int i=1;i<=N;i++){ DP[i][0]=DP1[i][1]*sums[1]+DP1[i][0]*sums[0]; DP[i][0]%=modulo; DP[i][1]=DP1[i][1]*sums[0]+DP1[i][0]*sums[1]; DP[i][1]%=modulo; DP[i][2]=DP1[i][2]*binexpo(N,2*(DP2[0][0]))+ (DP1[i][0]*sums[2]+ DP1[i][1]*sums[3])%modulo; DP[i][2]%=modulo; DP[i][3]=DP1[i][3]*binexpo(N,2*(DP2[0][0]))+ (DP1[i][1]*sums[2]+ DP1[i][0]*sums[3])%modulo; DP[i][3]%=modulo; } DP[0][0]=DP1[0][0]+DP2[0][0]; return DP; }; function<vector<vector<int>>(int)> solve = [&](int d){ if(d==1)return DPbase; auto half = solve(d/2); auto DP = combine(half,half); if(d&1)DP=combine(DP,DPbase); return DP; }; D%=modulo; auto s = solve(D); cout << combine(s,DPend)[1][2] << '\n'; }
#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...