Record99456304,测试点全输出 0。
对拍无果,小数据拍不出问题,大数据纯随机答案很小(不超过 5),也拍不出来。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define mp make_pair
#define fi first
#define pb push_back
#define se second
const int mod = 1e9 + 7;
int n, f[300010], cnt[300010], son[300010][3], siz[300010], dep[100010], sup[300010], anc[300010][25];
vector<int> g[300010];
int find(int u, int d) {
for (int i = 22; i >= 0; i--)
if (anc[u][i] && dep[anc[u][i]] <= d) u = anc[u][i];
if (dep[u] != d) u = 0; return u;
}
int Yyc(int v1, int v2) {
if (siz[v1] > siz[v2]) swap(v1, v2);
if (!sup[v1]) {
if (!sup[v2] || (dep[sup[v2]] - dep[v2] + 1 > siz[v1])) {
int w = find(v2, dep[v2] + siz[v1]);
return w ? f[w] : 1;
}
}
return 0;
}
void dp(int u, int fa) {
siz[u] = 1;
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i];
if (v == fa) continue;
dep[v] = dep[u] + 1;
dp(v, u);
anc[u][0] = v;
sup[u] = sup[v];
siz[u] += siz[v];
son[u][cnt[u]++] = v;
if (cnt[u] >= 3) {
cout << "0\n";
exit(0);
}
}
for (int j = 1; j <= 22; j++) anc[u][j] = anc[anc[u][j - 1]][j - 1];
if (!cnt[u]) {
f[u] = 1;
} else if (cnt[u] == 1) {
if (cnt[son[u][0]] == 0) f[u]++;
if (cnt[son[u][0]] == 1) f[u] += f[son[son[u][0]][0]];
f[u] += f[son[u][0]];
if (sup[u]) {
int v1 = son[sup[u]][0], v2 = son[sup[u]][1];
// cout << v1 << " " << v2 << " QAQA\n";
if (!sup[v1] && (dep[v1] - dep[u] == siz[v1] || dep[v1] - dep[u] - 1 == siz[v1] + 1)) {
f[u] += f[v2];
}
if (!sup[v2] && (dep[v2] - dep[u] == siz[v2] || dep[v2] - dep[u] - 1 == siz[v2] + 1)) {
f[u] += f[v1];
}
bool fl = 1;
if (cnt[v1] == 2) {
int w1 = v2, w2 = son[v1][1], z = son[v1][0];
if (fl && !sup[z] && siz[z] + 1 == dep[v1] - dep[u]) {
if (Yyc(w1, w2)) {
fl = 1;
f[u] += Yyc(w1, w2);
}
}
swap(son[v1][0], son[v1][1]); w2 = son[v1][1], z = son[v1][0];
if (fl && !sup[z] && siz[z] + 1 == dep[v1] - dep[u]) {
if (Yyc(w1, w2)) {
fl = 1;
f[u] += Yyc(w1, w2);
}
}
}
swap(v1, v2);
if (cnt[v1] == 2) {
int w1 = v2, w2 = son[v1][1], z = son[v1][0];
if (fl && !sup[z] && siz[z] + 1 == dep[v1] - dep[u]) {
if (Yyc(w1, w2)) {
fl = 1;
f[u] += Yyc(w1, w2);
}
}
swap(son[v1][0], son[v1][1]); w2 = son[v1][1], z = son[v1][0];
if (fl && !sup[z] && siz[z] + 1 == dep[v1] - dep[u]) {
if (Yyc(w1, w2)) {
fl = 1;
f[u] += Yyc(w1, w2);
}
}
}
} else {
if (siz[u] > 2 && siz[u] % 2 == 0) f[u]++;
}
} else {
sup[u] = u;
int v1 = son[u][0], v2 = son[u][1];
if (siz[v1] > siz[v2]) swap(v1, v2);
// cerr << u << " with v1 " << v1 << " v2 " << v2 << "\n";
if (!sup[v1] && (!sup[v2] || dep[sup[v2]] - dep[v2] > siz[v1])) {
int w1 = find(v2, dep[u] + siz[v1] + 2); f[u] += w1 ? f[w1] : 1;
// cerr << u << " with w1 " << w1 << " " << " QwQ\n";
}
if (!sup[v1] && (!sup[v2] || dep[sup[v2]] - dep[v2] + 1 > siz[v1] - 1)) {
int w2 = find(v2, dep[u] + siz[v1]); f[u] += w2 ? f[w2] : 1;
// cerr << u << " with w2 " << w2 << " " << " QwQ\n";
}
}
f[u] %= mod;
}
signed main() {
// freopen("F:\\data.in", "r", stdin);
cin >> n;
for (int i = 1; i < n; i++) {
int u, v;
cin >> u >> v;
g[u].pb(v), g[v].pb(u);
}
dep[1] = 1; dp(1, 0);
cout << f[1] << "\n";
// for (int i = 1; i <= n; i++) {
// cerr << "dp_" << i << ": " << f[i] <<" AwA\n";
// }
}