tjut 4661

#pragma comment(linker,"/STACK:100000000,100000000")  
#include <stdio.h>  
#define LL __int64  
  
const int mod = 1000000007;  
const int maxn = 1000003;  
struct EDGE{  
    int to, next;  
}edge[maxn*2];  
  
int head[maxn], E, cnt[maxn];  
LL jie[maxn], mul[maxn];  
  
void init(int n) {  
    for(int i = 1;i <= n; i++)  head[i] = -1;  
    E = 0;  
}  
  
void newedge(int u, int to) {  
    edge[E].to = to;  
    edge[E].next = head[u];  
    head[u] = E++;  
}  
  
LL modstyle(LL x) {  // 取余操作,由于取余%很慢的,这样写效率比较好  
    if(x >= mod)    x %= mod;  
    else if(x < 0) {  
        x = (x%mod+mod)%mod;  
    }  
    return x;  
}  
//  扩展欧几里得  求逆元  
LL exgcd(LL a ,LL b, LL &x, LL &y) {  
    if(b == 0) {  
        x = 1; y = 0;  
        return a;;  
    }  
    LL ans = exgcd(b, a%b, y, x);  
    y = y - a/b*x;  
    return ans;  
}  
//  求组合数 C(n,k)  
LL cal(int n, int k) {  
    LL x, y;  
    LL d = exgcd(jie[n-k]*jie[k], mod, x, y);  
    x = modstyle(x);  
    return jie[n]*x%mod;  
}  
//  第一次DFS统计出每个节点的所有的子树的总结点数cnt[u],子树节点信息传到该节点的情况数mul[u]  
void dfs1(int u, int pre) {  
    cnt[u] = 0;  
    mul[u] = 1;  
    for(int i = head[u];i != -1;i = edge[i].next) {  
        int to = edge[i].to;  
        if(to != pre) {  
            dfs1(to, u);  
            cnt[u] += cnt[to]+1;  
            mul[u] = modstyle(mul[u]*mul[to]);  
        }  
    }  
    int sum = cnt[u];  
    for(int i = head[u];i != -1;i = edge[i].next) {  
        int to = edge[i].to;  
        if(to != pre) {  
            mul[u] = modstyle(mul[u]*cal(sum, cnt[to]+1)); //   对于子树的情况利用组合数进行汇聚  
            sum -= cnt[to]+1;  
        }  
    }  
}  
  
LL ans = 0;  
int n;  
  
void dfs2(int u, int pre) {  
    if(pre != -1) {  //   父节点的信息传到该节点进行更新计算  
        LL x, y;  
        LL d = exgcd(cal(n-1, cnt[u]+1), mod, x, y);  
        x = modstyle(x);  
        LL cur = mul[pre]*x%mod;  
        cur = cur*cal(n-1, cnt[u])%mod;  
        mul[u] = cur;  
        ans = (ans + cur*cur)%mod;  
    }  
    for(int i = head[u];i != -1;i = edge[i].next) {  
        int to = edge[i].to;  
        if(to != pre) {  
            dfs2(to, u);  
        }  
    }  
}  
  
int main() {  
    int i, t, u, to;  
    jie[0] = 1;  
    for(i = 1;i <= 1000000; i++) {  
        jie[i] = modstyle(jie[i-1]*i);  
    }  
    scanf("%d", &t);  
    while(t--) {  
        scanf("%d", &n);  
        if(n == 1) {  
            puts("1");  
            continue;  
        }  
        init(n);  
        for(i = 0;i < n-1; i++) {  
            scanf("%d%d", &u, &to);  
            newedge(u, to);  
            newedge(to, u);  
        }  
        dfs1(1, -1);  
        ans = mul[1]*mul[1]%mod;  
        dfs2(1, -1);  
        printf("%I64d\n", ans);  
    }  
    return 0;  
}  

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值