#include <bits/stdc++.h>
#define FOR(i, a, b) for (auto i = (a); i <= (b); i++)
#define ROF(i, a, b) for (auto i = (a); i >= (b); i--)
using namespace std;
using ll = long long;
const int mod = 1e9 + 7, I = 100005;
int dp[I][2][2], dp1[I][2][2], dp2[I][2][2], win[I], win1[I], win2[I];
vector<int> adj[I];
void init(int x, int p) {
int lose = 0;
for (auto y : adj[x]) {
if (y == p) continue;
init(y, x);
if (!win1[y]) lose++;
}
win1[x] = lose > 0;
FOR(z, 0, 1) dp1[x][z][lose + !z > 0]++;
for (auto y : adj[x]) {
if (y == p) continue;
FOR(z, 0, 1) FOR(q, 0, 1) (dp1[x][z][lose - !win1[y] + !q > 0] += dp1[y][z][q]) %= mod;
}
}
void reroot(int x, int p) {
int lose = 0, s[2][2][2]{};
if (p) {
if (!win2[x]) lose++;
FOR(z, 0, 1) FOR(q, 0, 1) (s[win2[x]][z][q] += dp2[x][z][q]) %= mod;
}
for (auto y : adj[x]) {
if (y == p) continue;
if (!win1[y]) lose++;
FOR(z, 0, 1) FOR(q, 0, 1) (s[win1[y]][z][q] += dp1[y][z][q]) %= mod;
}
win[x] = lose > 0;
FOR(z, 0, 1) dp[x][z][lose + !z > 0]++;
FOR(w, 0, 1) FOR(z, 0, 1) FOR(q, 0, 1) (dp[x][z][lose - !w + !q > 0] += s[w][z][q]) %= mod;
for (auto y : adj[x]) {
if (y == p) continue;
win2[y] = lose - !win1[y] > 0;
FOR(z, 0, 1) FOR(q, 0, 1) (((s[win1[y]][z][q] -= dp1[y][z][q]) %= mod) += mod) %= mod;
FOR(z, 0, 1) dp2[y][z][lose - !win1[y] + !z > 0]++;
FOR(w, 0, 1) FOR(z, 0, 1) FOR(q, 0, 1) (dp2[y][z][lose - !win1[y] - !w + !q > 0] += s[w][z][q]) %= mod;
FOR(z, 0, 1) FOR(q, 0, 1) (s[win1[y]][z][q] += dp1[y][z][q]) %= mod;
reroot(y, x);
}
}
vector<vector<int>> mul(const vector<vector<int>>& a, const vector<vector<int>>& b) {
int n = a.size(), t = b.size(), m = b[0].size();
vector c(n, vector<int>(m));
FOR(i, 0, n - 1) FOR(j, 0, m - 1) FOR(k, 0, t - 1) (c[i][j] += 1LL * a[i][k] * b[k][j] % mod) %= mod;
return c;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N; ll D;
cin >> N >> D;
FOR(i, 1, N - 1) {
int a, b;
cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
init(1, 0);
reroot(1, 0);
vector a(2, vector<int>(2));
int W = 0;
FOR(i, 1, N) {
W += win[i];
FOR(z, 0, 1) FOR(q, 0, 1) (a[z][q] += dp[i][z][q]) %= mod;
}
vector b(2, vector<int>(2));
b[0][0] = b[1][1] = 1;
for (D--; D; D /= 2, a = mul(a, a)) if (D % 2) b = mul(b, a);
cout << mul(mul({{N - W, W}}, b), {{dp[1][0][1]}, {dp[1][1][1]}})[0][0];
return 6/22;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |