51Nod - 1632
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取模后的值。Sample Input
3 1 2 1 3
Sample Output
8
题解:
期望怎么求?(百度上的例子:https://baike.baidu.com/item/数学期望/5362790?fr=aladdin)
由于题中明确说了是树,所以没断一条边,连通块数量就加一,而且断边的概率为0.5,那么就有连通的期望为E = (n-1)*0.5+1(因为连通块个数最小为1,所以最后肯定要加一个1),显然这个是可能给小数的,但是给他乘以了2^(n-1),所以就变成了ans = (n+1)*2^(n-2)
代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<algorithm> 5 #include<math.h> 6 #include<vector> 7 #include<queue> 8 #include<stack> 9 #include<map> 10 using namespace std; 11 typedef long long ll; 12 const int maxn=5e4+10; 13 const int INF=0x3f3f3f3f; 14 const double eps=1e-10; 15 const int mod = 1e9+7; 16 #define mt(A,B) memset(A,B,sizeof(A)) 17 #define lson l,m,rt*2 18 #define rson m+1,r,rt*2+1 19 int main() 20 { 21 ll n; 22 while(~scanf("%lld", &n)) 23 { 24 ll a,b; 25 ll k=n+1; 26 for(ll i=1; i<n; i++) 27 scanf("%lld%lld",&a,&b); 28 for(ll i=0; i<n-2;i++) 29 k=k*2%mod; 30 printf("%lld\n",k); 31 } 32 return 0; 33 }