답안 #578530

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
578530 2022-06-17T08:03:51 Z amunduzbaev Star Trek (CEOI20_startrek) C++17
45 / 100
90 ms 19104 KB
#include "bits/stdc++.h"
using namespace std;
 
#define ar array
typedef int64_t ll;
#define int ll
 
const int N = 1e5 + 5;
const int mod = 1e9 + 7;
vector<int> edges[N];
int dp[N], up[N], cnt[N], n;
int sub[N], rev[N], tot[N], tmp[N];

void dfs(int u, int p = -1){
	for(auto x : edges[u]){
		if(x == p) continue;
		dfs(x, u);
		if(dp[x] == 0){
			dp[u] = 1, 
			tmp[u] += sub[x], 
			cnt[u]++;
		} 
		
		tot[u] += sub[x];
	}
	
	if(cnt[u] > 1) sub[u] = 0;
	if(cnt[u] == 1) sub[u] = tmp[u];
	if(cnt[u] == 0) sub[u] = tot[u] + 1;
}

void re(int u, int p = -1){
	tot[u] += rev[u];
	if(up[u] == 0){
		tmp[u] += rev[u];
		dp[u] = 1, cnt[u]++;
	}
	if(cnt[u] > 1) sub[u] = 0;
	if(cnt[u] == 1) sub[u] = tmp[u];
	if(cnt[u] == 0) sub[u] = tot[u] + 1;
	
	for(auto x : edges[u]){
		if(x == p) continue;
		tot[u] -= sub[x];
		if(!dp[x]){
			cnt[u]--, tmp[u] -= sub[x];
		}
		
		if(cnt[u]) up[x] = 1;
		if(cnt[u] > 1) rev[x] = 0;
		if(cnt[u] == 1) rev[x] = tmp[u];
		if(cnt[u] == 0) rev[x] = tot[u] + 1;
		
		tot[u] += sub[x];
		if(!dp[x]){
			cnt[u]++, tmp[u] += sub[x];
		}
		
		re(x, u);
	}
}

int bp(int a, int b){
	int c=1;
	while(b){
		if(b&1) c = c * 1ll * a % mod;
		a = a * 1ll * a % mod, b >>= 1;
	} return c;
}

signed main(){
	ios::sync_with_stdio(0); cin.tie(0);
	
	int d; cin>>n>>d;
	for(int i=1;i<n;i++){
		int a, b; cin>>a>>b;
		edges[a].push_back(b);
		edges[b].push_back(a);
	}
	
	dfs(1);
	up[1] = 1;
	re(1);
	int E = 0, L = 0;
	for(int i=1;i<=n;i++){
		if(dp[i] == 1) E = (E + sub[i]) % mod;
		else E = (E - sub[i] + mod) % mod, L++;
	}
	
	int F = n * 1ll * n % mod;
	d--;
	//~ cout<<bp(F, d)<<" "<<bp(E, d)<<" "<<bp((E - F + mod) % mod, mod - 2)<<"\n";
	int res = (bp(F, d) - bp(E, d) + mod) % mod * 1ll * bp((F - E + mod) % mod, mod - 2) % mod;
	if(!d) res = 1;
	//~ cout<<res<<"\n";
	res = res * 1ll * L % mod;
	if(dp[1]){
		res = res * 1ll * sub[1] % mod;
	} else {
		res = (bp(F, d + 1) - res * 1ll * sub[1] % mod + mod) % mod;
	}
	
	res = (bp(F, d + 1) - res + mod) % mod;
	res = (res % mod + mod) % mod;
	cout<<res<<"\n";
}
 
/*
 
5 1
1 2
2 3
2 4
1 5
 
*/
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2644 KB Output is correct
2 Incorrect 2 ms 2772 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Correct 1 ms 2644 KB Output is correct
3 Correct 2 ms 2644 KB Output is correct
4 Correct 2 ms 2644 KB Output is correct
5 Correct 2 ms 2644 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Correct 2 ms 2644 KB Output is correct
3 Correct 2 ms 2676 KB Output is correct
4 Correct 2 ms 2644 KB Output is correct
5 Correct 2 ms 2644 KB Output is correct
6 Correct 2 ms 2644 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Correct 2 ms 2644 KB Output is correct
3 Correct 2 ms 2676 KB Output is correct
4 Correct 2 ms 2644 KB Output is correct
5 Correct 2 ms 2644 KB Output is correct
6 Correct 2 ms 2644 KB Output is correct
7 Correct 2 ms 2772 KB Output is correct
8 Correct 2 ms 2804 KB Output is correct
9 Correct 2 ms 2680 KB Output is correct
10 Correct 2 ms 2772 KB Output is correct
11 Correct 2 ms 2772 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Correct 2 ms 2644 KB Output is correct
3 Correct 2 ms 2676 KB Output is correct
4 Correct 2 ms 2644 KB Output is correct
5 Correct 2 ms 2644 KB Output is correct
6 Correct 2 ms 2644 KB Output is correct
7 Correct 2 ms 2772 KB Output is correct
8 Correct 2 ms 2804 KB Output is correct
9 Correct 2 ms 2680 KB Output is correct
10 Correct 2 ms 2772 KB Output is correct
11 Correct 2 ms 2772 KB Output is correct
12 Correct 74 ms 15024 KB Output is correct
13 Correct 90 ms 19104 KB Output is correct
14 Correct 77 ms 11728 KB Output is correct
15 Correct 73 ms 11684 KB Output is correct
16 Correct 65 ms 11852 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Correct 2 ms 2644 KB Output is correct
3 Correct 2 ms 2676 KB Output is correct
4 Correct 2 ms 2644 KB Output is correct
5 Correct 2 ms 2644 KB Output is correct
6 Correct 2 ms 2644 KB Output is correct
7 Correct 2 ms 2772 KB Output is correct
8 Correct 2 ms 2804 KB Output is correct
9 Correct 2 ms 2680 KB Output is correct
10 Correct 2 ms 2772 KB Output is correct
11 Correct 2 ms 2772 KB Output is correct
12 Correct 2 ms 2644 KB Output is correct
13 Incorrect 2 ms 2772 KB Output isn't correct
14 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Correct 2 ms 2644 KB Output is correct
3 Correct 2 ms 2676 KB Output is correct
4 Correct 2 ms 2644 KB Output is correct
5 Correct 2 ms 2644 KB Output is correct
6 Correct 2 ms 2644 KB Output is correct
7 Correct 2 ms 2772 KB Output is correct
8 Correct 2 ms 2804 KB Output is correct
9 Correct 2 ms 2680 KB Output is correct
10 Correct 2 ms 2772 KB Output is correct
11 Correct 2 ms 2772 KB Output is correct
12 Correct 74 ms 15024 KB Output is correct
13 Correct 90 ms 19104 KB Output is correct
14 Correct 77 ms 11728 KB Output is correct
15 Correct 73 ms 11684 KB Output is correct
16 Correct 65 ms 11852 KB Output is correct
17 Correct 2 ms 2644 KB Output is correct
18 Incorrect 2 ms 2772 KB Output isn't correct
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2644 KB Output is correct
2 Incorrect 2 ms 2772 KB Output isn't correct
3 Halted 0 ms 0 KB -