#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD = 1000000007;
struct Matrix{
int n, m;
ll mat[2][2];
Matrix(){}
Matrix(int n, int m): n(n), m(m){
for(int i=0; i<n; i++) for(int j=0; j<m; j++) mat[i][j] = 0;
}
Matrix operator*(const Matrix &r)const{
assert(m == r.n);
Matrix ret (n, r.m);
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
for(int k=0; k<r.m; k++){
ret.mat[i][k] += mat[i][j] * r.mat[j][k];
ret.mat[i][k] %= MOD;
}
}
}
return ret;
}
};
ll mpow(ll x, ll y){
if(!y) return 1;
if(y%2) return mpow(x, y-1) * x % MOD;
ll tmp = mpow(x, y/2);
return tmp*tmp%MOD;
}
Matrix BasicMatrix(int n, int m){
Matrix mat (n, m);
assert(n==m);
for(int i=0; i<n; i++) mat.mat[i][i] = 1;
return mat;
}
Matrix mpow(Matrix x, ll y){
if(!y) return BasicMatrix(x.n, x.m);
if(y&1) return mpow(x, y-1) * x;
Matrix tmp = mpow(x, y/2);
return tmp * tmp;
}
int n, lim;
ll k;
vector<int> link[100002][2];
bool mat[300002];
int ey[300002];
bool canWin[100002];
bool dfsChk[300002];
int group[100002], groupCnt[2];
ll ans;
bool groupVisited[100002];
void groupDfs(int x, int p=-1){
groupCnt[group[x]]++;
groupVisited[x] = 1;
for(auto y: link[x][0]){
if(ey[y]==p || groupVisited[ey[y]]) continue;
group[ey[y]] = !group[x];
groupDfs(ey[y], x);
}
}
int winCnt[100002];
bool dfs(int pe){
if(dfsChk[pe]) return mat[pe];
int x = ey[pe];
mat[pe] = !!(winCnt[x] - (pe > lim ? 0 : (dfsChk[pe^1] && !mat[pe^1])));
dfsChk[pe] = 1;
vector<int> nLink;
for(auto y: link[x][0]){
if((y^pe)==1) nLink.push_back(y);
else if(!dfs(y)) winCnt[x]++, mat[pe] = 1;
}
link[x][0].swap(nLink);
return mat[pe];
}
int find1[300002][2];
int findV[100002][2];
bool findChk[2][300002];
int dfsFind(int pe, bool dp){ /// 무조건 지나야 하는 상대 차례 점 개수 찾기
if(findChk[dp][pe]) return find1[pe][dp];
int x = ey[pe];
findChk[dp][pe] = 1;
if(!dp){ /// my turn
int cnt = 0;
for(auto y: link[x][0]){
if((y^1)!=pe && !mat[y]) cnt++;
}
if(cnt > 1) return find1[pe][dp] = 0;
assert(cnt == 1);
for(auto y: link[x][0]){
if((y^1)!=pe && !mat[y]) return find1[pe][dp] = dfsFind(y, !dp);
}
exit(1);
}
else{ /// your turn
int ret = 1 + findV[x][1] - ((pe>lim || !findChk[0][pe^1]) ? 0 : find1[pe^1][0]);
vector<int> v;
for(auto y: link[x][1]){
if((y^1)==pe) v.push_back(y);
else{
int tmp = dfsFind(y, !dp);
ret += tmp, findV[x][1] += tmp;
}
}
link[x][1].swap(v);
return find1[pe][dp] = ret;
}
}
int main(){
// freopen("input.txt", "r", stdin);
scanf("%d %lld", &n, &k);
lim = (n-1)*2-1;
for(int i=1; i<n; i++){
int x, y;
scanf("%d %d", &x, &y);
link[x][0].push_back(i*2-2);
link[x][1].push_back(i*2-2);
link[y][0].push_back(i*2-1);
link[y][1].push_back(i*2-1);
ey[i*2-2] = y;
ey[i*2-1] = x;
}
for(int i=1; i<=n; i++){
link[i][0].shrink_to_fit();
link[i][1].shrink_to_fit();
}
for(int i=1; i<=n; i++){
ey[lim+i] = i;
}
groupDfs(1);
for(int i=1; i<=n; i++){
canWin[i] = dfs(lim+i);
}
for(int i=1; i<=n; i++) link[i][0] = link[i][1];
for(int i=1; i<=n; i++){
if(canWin[i]) dfsFind(lim+i, 0);
else dfsFind(lim+i, 1);
}
for(int i=1; i<=n; i++){
link[i][0].clear();
link[i][0].shrink_to_fit();
link[i][1].clear();
link[i][1].shrink_to_fit();
}
Matrix first (1, 2);
first.mat[0][0] = first.mat[0][1] = 0;
for(int i=1; i<=n; i++){
if(canWin[i]) first.mat[0][0]++;
else first.mat[0][1]++;
}
Matrix multiplier (2, 2); /// 0: WIN, 1: LOSE
for(int i=1; i<=n; i++){
if(canWin[i]){
multiplier.mat[0][0] = (multiplier.mat[0][0] + n) % MOD;
multiplier.mat[1][0] = (multiplier.mat[1][0] + groupCnt[group[i]]) % MOD;
multiplier.mat[1][0] = (multiplier.mat[1][0] + (groupCnt[!group[i]] - find1[lim+i][0])) % MOD;
multiplier.mat[1][1] = (multiplier.mat[1][1] + n - groupCnt[group[i]] - (groupCnt[!group[i]] - find1[lim+i][0]) + MOD)%MOD;
}
else{
multiplier.mat[1][0] = (multiplier.mat[1][0] + find1[lim+i][1]) % MOD;
multiplier.mat[0][1] = (multiplier.mat[0][1] + n) % MOD;
multiplier.mat[1][1] = (multiplier.mat[1][1] + n - find1[lim+i][1]) % MOD;
}
}
multiplier = mpow(multiplier, k-1);
first = first * multiplier;
ll Wsum = first.mat[0][0], Lsum = first.mat[0][1];
ll ans = 0;
if(canWin[1]){
ans = (Wsum * n + Lsum * groupCnt[group[1]] + Lsum * (groupCnt[!group[1]] - find1[lim+1][0])) % MOD;
}
else ans = Lsum * find1[lim+1][1] % MOD;
printf("%lld", ans);
}
Compilation message
startrek.cpp: In function 'int main()':
startrek.cpp:125:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
125 | scanf("%d %lld", &n, &k);
| ~~~~~^~~~~~~~~~~~~~~~~~~
startrek.cpp:129:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
129 | scanf("%d %d", &x, &y);
| ~~~~~^~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4948 KB |
Output is correct |
2 |
Correct |
4 ms |
5280 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4948 KB |
Output is correct |
2 |
Correct |
2 ms |
5012 KB |
Output is correct |
3 |
Correct |
2 ms |
4948 KB |
Output is correct |
4 |
Correct |
3 ms |
4948 KB |
Output is correct |
5 |
Correct |
3 ms |
5076 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4948 KB |
Output is correct |
2 |
Correct |
3 ms |
5012 KB |
Output is correct |
3 |
Correct |
3 ms |
5076 KB |
Output is correct |
4 |
Correct |
3 ms |
5076 KB |
Output is correct |
5 |
Correct |
3 ms |
5076 KB |
Output is correct |
6 |
Correct |
3 ms |
5064 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4948 KB |
Output is correct |
2 |
Correct |
3 ms |
5012 KB |
Output is correct |
3 |
Correct |
3 ms |
5076 KB |
Output is correct |
4 |
Correct |
3 ms |
5076 KB |
Output is correct |
5 |
Correct |
3 ms |
5076 KB |
Output is correct |
6 |
Correct |
3 ms |
5064 KB |
Output is correct |
7 |
Correct |
3 ms |
5204 KB |
Output is correct |
8 |
Correct |
4 ms |
5332 KB |
Output is correct |
9 |
Correct |
3 ms |
5204 KB |
Output is correct |
10 |
Correct |
3 ms |
5204 KB |
Output is correct |
11 |
Correct |
4 ms |
5204 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4948 KB |
Output is correct |
2 |
Correct |
3 ms |
5012 KB |
Output is correct |
3 |
Correct |
3 ms |
5076 KB |
Output is correct |
4 |
Correct |
3 ms |
5076 KB |
Output is correct |
5 |
Correct |
3 ms |
5076 KB |
Output is correct |
6 |
Correct |
3 ms |
5064 KB |
Output is correct |
7 |
Correct |
3 ms |
5204 KB |
Output is correct |
8 |
Correct |
4 ms |
5332 KB |
Output is correct |
9 |
Correct |
3 ms |
5204 KB |
Output is correct |
10 |
Correct |
3 ms |
5204 KB |
Output is correct |
11 |
Correct |
4 ms |
5204 KB |
Output is correct |
12 |
Correct |
240 ms |
25336 KB |
Output is correct |
13 |
Correct |
249 ms |
32788 KB |
Output is correct |
14 |
Correct |
156 ms |
19056 KB |
Output is correct |
15 |
Correct |
221 ms |
19000 KB |
Output is correct |
16 |
Correct |
206 ms |
19072 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4948 KB |
Output is correct |
2 |
Correct |
3 ms |
5012 KB |
Output is correct |
3 |
Correct |
3 ms |
5076 KB |
Output is correct |
4 |
Correct |
3 ms |
5076 KB |
Output is correct |
5 |
Correct |
3 ms |
5076 KB |
Output is correct |
6 |
Correct |
3 ms |
5064 KB |
Output is correct |
7 |
Correct |
3 ms |
5204 KB |
Output is correct |
8 |
Correct |
4 ms |
5332 KB |
Output is correct |
9 |
Correct |
3 ms |
5204 KB |
Output is correct |
10 |
Correct |
3 ms |
5204 KB |
Output is correct |
11 |
Correct |
4 ms |
5204 KB |
Output is correct |
12 |
Correct |
2 ms |
4948 KB |
Output is correct |
13 |
Correct |
3 ms |
5204 KB |
Output is correct |
14 |
Correct |
2 ms |
4948 KB |
Output is correct |
15 |
Correct |
3 ms |
5012 KB |
Output is correct |
16 |
Correct |
4 ms |
5076 KB |
Output is correct |
17 |
Correct |
4 ms |
5076 KB |
Output is correct |
18 |
Correct |
3 ms |
5076 KB |
Output is correct |
19 |
Correct |
3 ms |
5076 KB |
Output is correct |
20 |
Correct |
3 ms |
5076 KB |
Output is correct |
21 |
Correct |
4 ms |
5204 KB |
Output is correct |
22 |
Correct |
4 ms |
5272 KB |
Output is correct |
23 |
Correct |
4 ms |
5144 KB |
Output is correct |
24 |
Correct |
4 ms |
5168 KB |
Output is correct |
25 |
Correct |
5 ms |
5076 KB |
Output is correct |
26 |
Correct |
3 ms |
5204 KB |
Output is correct |
27 |
Correct |
3 ms |
5332 KB |
Output is correct |
28 |
Correct |
3 ms |
5076 KB |
Output is correct |
29 |
Correct |
3 ms |
5076 KB |
Output is correct |
30 |
Correct |
4 ms |
5204 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4948 KB |
Output is correct |
2 |
Correct |
3 ms |
5012 KB |
Output is correct |
3 |
Correct |
3 ms |
5076 KB |
Output is correct |
4 |
Correct |
3 ms |
5076 KB |
Output is correct |
5 |
Correct |
3 ms |
5076 KB |
Output is correct |
6 |
Correct |
3 ms |
5064 KB |
Output is correct |
7 |
Correct |
3 ms |
5204 KB |
Output is correct |
8 |
Correct |
4 ms |
5332 KB |
Output is correct |
9 |
Correct |
3 ms |
5204 KB |
Output is correct |
10 |
Correct |
3 ms |
5204 KB |
Output is correct |
11 |
Correct |
4 ms |
5204 KB |
Output is correct |
12 |
Correct |
240 ms |
25336 KB |
Output is correct |
13 |
Correct |
249 ms |
32788 KB |
Output is correct |
14 |
Correct |
156 ms |
19056 KB |
Output is correct |
15 |
Correct |
221 ms |
19000 KB |
Output is correct |
16 |
Correct |
206 ms |
19072 KB |
Output is correct |
17 |
Correct |
2 ms |
4948 KB |
Output is correct |
18 |
Correct |
3 ms |
5204 KB |
Output is correct |
19 |
Correct |
2 ms |
4948 KB |
Output is correct |
20 |
Correct |
3 ms |
5012 KB |
Output is correct |
21 |
Correct |
4 ms |
5076 KB |
Output is correct |
22 |
Correct |
4 ms |
5076 KB |
Output is correct |
23 |
Correct |
3 ms |
5076 KB |
Output is correct |
24 |
Correct |
3 ms |
5076 KB |
Output is correct |
25 |
Correct |
3 ms |
5076 KB |
Output is correct |
26 |
Correct |
4 ms |
5204 KB |
Output is correct |
27 |
Correct |
4 ms |
5272 KB |
Output is correct |
28 |
Correct |
4 ms |
5144 KB |
Output is correct |
29 |
Correct |
4 ms |
5168 KB |
Output is correct |
30 |
Correct |
5 ms |
5076 KB |
Output is correct |
31 |
Correct |
3 ms |
5204 KB |
Output is correct |
32 |
Correct |
3 ms |
5332 KB |
Output is correct |
33 |
Correct |
3 ms |
5076 KB |
Output is correct |
34 |
Correct |
3 ms |
5076 KB |
Output is correct |
35 |
Correct |
4 ms |
5204 KB |
Output is correct |
36 |
Correct |
224 ms |
25216 KB |
Output is correct |
37 |
Correct |
257 ms |
32796 KB |
Output is correct |
38 |
Correct |
148 ms |
19060 KB |
Output is correct |
39 |
Correct |
197 ms |
18976 KB |
Output is correct |
40 |
Correct |
204 ms |
18968 KB |
Output is correct |
41 |
Correct |
245 ms |
29276 KB |
Output is correct |
42 |
Correct |
198 ms |
30408 KB |
Output is correct |
43 |
Correct |
128 ms |
17368 KB |
Output is correct |
44 |
Correct |
201 ms |
18996 KB |
Output is correct |
45 |
Correct |
201 ms |
18996 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4948 KB |
Output is correct |
2 |
Correct |
4 ms |
5280 KB |
Output is correct |
3 |
Correct |
3 ms |
4948 KB |
Output is correct |
4 |
Correct |
2 ms |
5012 KB |
Output is correct |
5 |
Correct |
2 ms |
4948 KB |
Output is correct |
6 |
Correct |
3 ms |
4948 KB |
Output is correct |
7 |
Correct |
3 ms |
5076 KB |
Output is correct |
8 |
Correct |
3 ms |
4948 KB |
Output is correct |
9 |
Correct |
3 ms |
5012 KB |
Output is correct |
10 |
Correct |
3 ms |
5076 KB |
Output is correct |
11 |
Correct |
3 ms |
5076 KB |
Output is correct |
12 |
Correct |
3 ms |
5076 KB |
Output is correct |
13 |
Correct |
3 ms |
5064 KB |
Output is correct |
14 |
Correct |
3 ms |
5204 KB |
Output is correct |
15 |
Correct |
4 ms |
5332 KB |
Output is correct |
16 |
Correct |
3 ms |
5204 KB |
Output is correct |
17 |
Correct |
3 ms |
5204 KB |
Output is correct |
18 |
Correct |
4 ms |
5204 KB |
Output is correct |
19 |
Correct |
240 ms |
25336 KB |
Output is correct |
20 |
Correct |
249 ms |
32788 KB |
Output is correct |
21 |
Correct |
156 ms |
19056 KB |
Output is correct |
22 |
Correct |
221 ms |
19000 KB |
Output is correct |
23 |
Correct |
206 ms |
19072 KB |
Output is correct |
24 |
Correct |
2 ms |
4948 KB |
Output is correct |
25 |
Correct |
3 ms |
5204 KB |
Output is correct |
26 |
Correct |
2 ms |
4948 KB |
Output is correct |
27 |
Correct |
3 ms |
5012 KB |
Output is correct |
28 |
Correct |
4 ms |
5076 KB |
Output is correct |
29 |
Correct |
4 ms |
5076 KB |
Output is correct |
30 |
Correct |
3 ms |
5076 KB |
Output is correct |
31 |
Correct |
3 ms |
5076 KB |
Output is correct |
32 |
Correct |
3 ms |
5076 KB |
Output is correct |
33 |
Correct |
4 ms |
5204 KB |
Output is correct |
34 |
Correct |
4 ms |
5272 KB |
Output is correct |
35 |
Correct |
4 ms |
5144 KB |
Output is correct |
36 |
Correct |
4 ms |
5168 KB |
Output is correct |
37 |
Correct |
5 ms |
5076 KB |
Output is correct |
38 |
Correct |
3 ms |
5204 KB |
Output is correct |
39 |
Correct |
3 ms |
5332 KB |
Output is correct |
40 |
Correct |
3 ms |
5076 KB |
Output is correct |
41 |
Correct |
3 ms |
5076 KB |
Output is correct |
42 |
Correct |
4 ms |
5204 KB |
Output is correct |
43 |
Correct |
224 ms |
25216 KB |
Output is correct |
44 |
Correct |
257 ms |
32796 KB |
Output is correct |
45 |
Correct |
148 ms |
19060 KB |
Output is correct |
46 |
Correct |
197 ms |
18976 KB |
Output is correct |
47 |
Correct |
204 ms |
18968 KB |
Output is correct |
48 |
Correct |
245 ms |
29276 KB |
Output is correct |
49 |
Correct |
198 ms |
30408 KB |
Output is correct |
50 |
Correct |
128 ms |
17368 KB |
Output is correct |
51 |
Correct |
201 ms |
18996 KB |
Output is correct |
52 |
Correct |
201 ms |
18996 KB |
Output is correct |
53 |
Correct |
258 ms |
32844 KB |
Output is correct |
54 |
Correct |
244 ms |
30072 KB |
Output is correct |
55 |
Correct |
137 ms |
16184 KB |
Output is correct |
56 |
Correct |
234 ms |
25316 KB |
Output is correct |
57 |
Correct |
182 ms |
19132 KB |
Output is correct |
58 |
Correct |
171 ms |
19064 KB |
Output is correct |
59 |
Correct |
192 ms |
18996 KB |
Output is correct |
60 |
Correct |
217 ms |
19000 KB |
Output is correct |