您的位置:首页 > 其它

51NOD 1632 B君的连通 期望计算 推公式 打表

2016-11-13 14:56 183 查看
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1632

#include<bits/stdc++.h>
using namespace std;
const long long MOD=1000000007;
const int MAX=100007;
long long Ans[MAX];
int N,a,b;
/*
因为这是一棵树,所以每炸毁一条边就会产生一个联通块.
当有N个点的时候,图中共有N-1条边.所以一共有2^(N-1)种情况.
因为答案要求乘上2^(N-1)再对MOD取模的答案,所以消除了2^(N-1).
Ans={ 1*C(N-1,1)*(1/(2^(N-1)))+2*C(N-1,2)*(1/(2^(N-1)))+3*C(N-1,3)*(1/(2^(N-1)))+ ... +N*C(N-1,N-1)*(1/(2^(N-1))) } * 2^(N-1).
Ans= 1*C(N-1,1)+2*C(N-1,2)+3*C(N-1,3)+ ... +N*C(N-1,N-1).
然后打个表发现上述式子可以简化为:
Ans[1]=1,Ans[i]=2*Ans[i-1]+2^(i-2).
用快速幂进行运算.
*/
long long QuickPow(long long a,long long n)
{
long long res=1;
while (n)
{
if (n&1)
res=(res*a)%MOD;
n>>=1;
a=(a*a)%MOD;
}
return res;
}
int main()
{
Ans[1]=1;
for (int i=2;i<MAX;i++)
Ans[i]=(2*Ans[i-1]+QuickPow(2,i-2))%MOD;
while (cin>>N)
{
for (int i=1;i<N;i++)
cin>>a>>b;
cout<<Ans
<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: