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; }