#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 2e5 + 5, mod = 1e9 + 7;
vector<int> G[maxn];
int sg[maxn];//sg[i]表示以1为根时,以i为根的子树的sg值
int n, fa[maxn];
int sg2[maxn];//sg2[i]表示以i为根时,整棵树的sg值
void init(){
for(int i = 1; i <= n; i++){
sg[i] = sg2[i] = 0;
G[i].clear();
}
}
void dfs(int u, int f){
fa[u] = f;
for(auto v : G[u]){
if(v == f) continue;
dfs(v, u);
sg[u] ^= (sg[v] + 1);//sg[u] = (sg[v1] + 1) ^ (sg[v2] + 1) ^ ... ^ (sg[vn] + 1)
}
}
void dfs2(int u, int f){
for(auto v : G[u]){
if(v == f) continue;
sg2[v] = sg[v] ^ ((sg2[u] ^ (sg[v] + 1)) + 1);//换根
dfs2(v, u);
}
}
int qpow(int a, int b){
int res = 1;
while(b){
if(b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
void solve(){
int i, j;
cin >> n;
init();
for(i = 1; i < n; i++){
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1, 1);
int cnt = 0, SG;
sg2[1] = sg[1];
dfs2(1, 1);
for(i = 1; i <= n; i++){
if(sg2[i]) cnt++;
}
cout << cnt * qpow(n, mod - 2) % mod << '\n';
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int T;
cin >> T;
while(T--){
solve();
}
return 0;
}
树上博弈(sg函数)
最新推荐文章于 2024-03-11 15:19:44 发布