51nod 1632 B君的连通

题目:

 

 

 

这题看起来难,其实这么多概率啥的都是唬人的。甚至连快速幂都不用就可以解。

 

解法:    n个节点,n-1条边,期望会有一半的边被炸毁(因为总体概率就是50%)。

    即(n-1)/2条边被炸毁,这时有(n+1)/2个连通块。(这个不是向下取整的)。
    所以f[n] = (n+1)/2*2^(n-1) = (n+1)*2^(n-2)。
 
 
 
代码:
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <map>
#include <set>
#include <list>
#include <queue> 
using namespace std;
typedef long long ll;
#define INF 2147483647
#define mod 1000000007

int n,x,y; 
 
int main(){
    cin >> n;
    for(int i = 0;i < n-1; i++){
        cin >> x >> y;
    }
    int ans = n+1;
    for(int i = 0;i < n-2; i++){
        ans = (ans*2)%mod;
    }
    cout << ans << endl;
    return 0;
} 

 

posted @ 2017-11-15 03:12  ninding  阅读(132)  评论(0编辑  收藏  举报