1632 B君的连通

B国拥有n个城市,其交通系统呈树状结构,即任意两个城市存在且仅存在一条交通线将其连接。A国是B国的敌国企图秘密发射导弹打击B国的交通线,现假设每条交通线都有50%的概率被炸毁,B国希望知道在被炸毁之后,剩下联通块的个数的期望是多少?

 

Input
一个数n(2<=n<=100000)
接下来n-1行,每行两个数x,y表示一条交通线。(1<=x,y<=n)
数据保证其交通系统构成一棵树。
Output
一行一个数,表示答案乘2^(n-1)后对1,000,000,007取模后的值。
Input示例
3
1 2
1 3
Output示例
8

思路:每炸毁一条边就多出一个连通图,所以最优是一个连通,最差是n个连通。选择一条边的概率是1/2,选择n条边就是1/2^(n-1),那么最后题目要求乘以2^(n-1),所以抵消了。 然后就知道使用组合数来做啦,取模求逆元即可。复杂度(n*log(n));

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<queue>
 5 #include<math.h>
 6 #include<stdlib.h>
 7 using namespace std;
 8 typedef long long LL;
 9 const int mod = 1e9+7;
10 LL N[100005];
11 LL quick(LL n,LL m,LL p);
12 int main(void)
13 {
14     int n;
15     N[0] = 1;
16     for(int i = 1;i <= 100000 ;i++)
17     {
18         N[i] = N[i-1]*(LL)i % mod;
19     }
20     scanf("%d",&n);
21     int s = n-1;
22     while(s--)
23     {   int x,y;
24         scanf("%d %d",&x,&y);
25     }
26     if(n == 1)
27         printf("1\n");
28     else
29     {
30         LL sum = 1;
31         for(int i = 1;i <= n-1; i++)
32         {
33             LL ak = i+1;
34             LL ap = N[n-1-i]*N[i]%mod;
35             ap = quick(ap,mod-2,mod);
36             ap*=ak;
37             ap%=mod;
38             sum = (sum + N[n-1]*ap%mod)%mod;
39         }
40         printf("%lld\n",sum);
41     }return 0;
42 }
43 LL quick(LL n,LL m,LL p)
44 {
45     n%=p;
46     LL ans = 1;
47     while(m)
48     {
49         if(m&1)
50             ans = ans*n%mod;
51         n = n*n%mod;
52         m>>=1;
53     }
54     return ans;
55 
56 }

 

转载于:https://www.cnblogs.com/zzuli2sjy/p/5788845.html

题目描述 B 站在一个 n×n 的棋盘上。最开始,B站在 (1,1) 这个点,他要走到 (n,n) 这个点。 B 每秒可以向上下左右的某个方向移动一格,但是很不妙,C 打算阻止 B 的计划。 每秒结束的时刻,C 会在 (x,y) 上摆一个路障。B 不能走在路障上。 B 拿到了 C 准备在哪些点放置路障。所以现在你需要判断,B 能否成功走到 (n,n)。 保证数据足够弱:也就是说,无需考虑“走到某处然后被一个路障砸死”的情况,因为答案不会出现此类情况。 输入格式 首先是一个正整数 T,表示数据组数。 对于每一组数据: 第一行,一个正整数 n。 接下来 2n−2 行,每行两个正整数 x 和 y,意义是在那一秒结束后,(x,y) 将被摆上路障。 输出格式 对于每一组数据,输出 Yes 或 No,回答 B 能否走到 (n,n)。 输入输出样例 输入 #1复制 2 2 1 1 2 2 5 3 3 3 2 3 1 1 2 1 3 1 4 1 5 2 2 输出 #1复制 Yes Yes 说明/提示 样例解释: 以下 0 表示能走,x 表示不能走,B 表示 B 现在的位置。从左往右表示时间。 Case 1: 0 0 0 0 0 B (已经走到了) B 0 x B x 0 Case 2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x 0 0 0 0 x 0 0 0 0 x 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x 0 0 0 0 x 0 0 B 0 0 0 0 0 B 0 0 0 0 0 B 0 0 0 0 x B 0 ......(B可以走到终点) 数据规模: 防止骗分,数据保证全部手造。 对于 20% 的数据,有 n≤3。 对于 60% 的数据,有 n≤500。 对于 100% 的数据,有 n≤1000。 对于 100% 的数据,有 T≤10
04-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值