51NOD 1632 B君的连通(推公式)——算法马拉松16
2016-08-01 10:27
330 查看
传送门
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
解题思路:
就是推一下公式,然后打一个表找一下规律就行了,因为每炸毁一条边就多一个连通图,所以就根据这个推出公式,因为选一条边的概率是 12\frac{1}2:然后进行操作的概率就是 12n−1)\frac{1}{2^{n-1})},然后再乘以 2n−12^{n-1} 就抵消了,所以公式就是:
1+2∗C(n−1,1)+3∗C(n−1,2)+...+n∗C(n−1,n−1)1+2*C(n-1,1)+3*C(n-1,2)+...+n*C(n-1,n-1)
然后打个表发现上述式子可以简化为:
ans[i]=2∗ans[i−1]+2i−2,ans[1]=1ans[i] = 2*ans[i-1]+2^{i-2}, ans[1] = 1
MyMy CodeCode:
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
解题思路:
就是推一下公式,然后打一个表找一下规律就行了,因为每炸毁一条边就多一个连通图,所以就根据这个推出公式,因为选一条边的概率是 12\frac{1}2:然后进行操作的概率就是 12n−1)\frac{1}{2^{n-1})},然后再乘以 2n−12^{n-1} 就抵消了,所以公式就是:
1+2∗C(n−1,1)+3∗C(n−1,2)+...+n∗C(n−1,n−1)1+2*C(n-1,1)+3*C(n-1,2)+...+n*C(n-1,n-1)
然后打个表发现上述式子可以简化为:
ans[i]=2∗ans[i−1]+2i−2,ans[1]=1ans[i] = 2*ans[i-1]+2^{i-2}, ans[1] = 1
MyMy CodeCode:
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; typedef long long LL; const LL MOD = 1e9+7; const int MAXN = 100000+5; LL quick_MOD(LL a, LL b) { LL ans = 1; while(b) { if(b & 1) ans = (ans*a)%MOD; b>>=1; a = (a*a)%MOD; } return ans; } LL c[50][50]; void Init1() { for(int i=0; i<50; i++) c[i][0] = 1; for(int i=1; i<50; i++) { for(int j=1; j<=i; j++) { c[i][j] = c[i-1][j]+c[i-1][j-1]; } } for(int i=1; i<=20; i++) { LL sum = 0; for(int j=0; j<=i; j++) { sum += (j+1)*c[i-1][j]; } cout<<"i = "<<i<<" : "<<sum<<endl; } } LL ans[MAXN]; void Init() { ans[1] = 1; for(int i=2; i<MAXN; i++) { ans[i] = 2*ans[i-1]+quick_MOD(2,i-2); ans[i] %= MOD; } } int main() { ///Init1(); Init(); LL n, x, y; while(cin>>n) { for(int i=0; i<n-1; i++) cin>>x>>y; cout<<ans <<endl; } return 0; }
相关文章推荐
- 51NOD 1632 B君的连通 期望计算 推公式 打表
- 51nod 算法马拉松25
- [排列组合 + 分段打表] 51nod 算法马拉松25 A. 二分答案
- 51Nod 算法马拉松15 记一次悲壮而又开心的骗分比赛
- 51nod算法马拉松12
- 51Nod 算法马拉松17 Simple KMP 链剖维护SAM的fail树
- 51nod 算法马拉松4
- 51nod 算法马拉松4 D装盒子(网络流 / 二分图最优匹配)
- 51Nod 算法马拉松18 复杂度分析 二进制按位累计代价
- [递推] 51nod 算法马拉松25 B. 完美序列
- 51Nod 算法马拉松12 Rikka with sequences
- 51Nod-算法马拉松23 B 谷歌的恐龙 [概率期望]【数学】
- 【51nod】【算法马拉松14】1586 约数和
- 【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版
- [51nod]算法马拉松18 总结
- 【51Nod 1756】【算法马拉松 23】谷歌的恐龙
- 【51NOD 1674】【51NOD 算法马拉松19】区间的价值 V2
- 51nod 算法马拉松6(索函数)(规律题目)
- 51nod 1632 B君的连通
- [FWT] 51Nod 算法马拉松26 A A国的贸易