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

来源:互联网 发布:概念式建筑设计知乎 编辑:程序博客网 时间:2024/05/22 06:09
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[N]<<endl;    }    return 0;}
0 0
原创粉丝点击