提出 #9220560


ソースコード 拡げる

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
#define fr(i,n) for(int i=0;i<(n);++i)
#define Fr(i,n) for(int i=1;i<=(n);++i)
#define ifr(i,n) for(int i=(n)-1;i>=0;--i)
#define iFr(i,n) for(int i=(n);i>0;--i)

struct modint{
    using i64=int_fast64_t;
    i64 a;
    static constexpr i64 MOD=1e9+7;
    modint(){a=0;}
    modint(i64 a_){
        a=a_%MOD;
        if(a<0) a+=MOD;
    }
    modint inv()const{
        i64 n=1,m=MOD-2,A=a;
        while(m){
            if(m&1)(n*=A)%=MOD;
            (A*=A)%=MOD;
            m>>=1;
        }
        modint y(n);
        return y;
    }
    bool operator==(const modint& x){
        return a==x.a;
    }
    bool operator!=(const modint& x){
        return a!=x.a;
    }
    modint& operator=(const modint& x){
        a=x.a;
        return *this;
    }
    modint operator+(const modint& x){
        modint y;
        y.a=a+x.a;
        if(y.a>MOD) y.a-=MOD;
        return y;
    }
    modint operator-(const modint& x){
        modint y;
        y.a=a-x.a;
        if(y.a<0) y.a+=MOD;
        return y;
    }
    modint operator*(const modint& x){
        modint y;
        y.a=(a*x.a)%MOD;
        return y;
    }
    modint operator/(const modint& x){
        modint y;
        y.a=(a*x.inv().a)%MOD;
        return y;
    }
    modint& operator+=(const modint& x){
        a+=x.a;
        if(a>=MOD) a-=MOD;
        return *this;
    }
    modint& operator-=(const modint& x){
        a-=x.a;
        if(a<0) a+=MOD;
        return *this;
    }
    modint& operator*=(const modint& x){
        (a*=x.a)%=MOD;
        return *this;
    }
    modint& operator/=(const modint& x){
        (a*=x.inv().a)%=MOD;
        return *this;
    }
};
istream& operator>>(istream &in,modint& x){
    int_fast64_t a_;
    in>>a_;
    modint y(a_);
    x=y;
    return in;
}
ostream& operator<<(ostream &out,const modint& x){
    out<<x.a;
    return out;
}
modint pwr(int_fast64_t a,int_fast64_t b){
    modint _;
    int_fast64_t n=1,A=a;
    while(b){
        if(b&1) (n*=A)%=modint::MOD;
        (A*=A)%=modint::MOD;
        b>>=1;
    }
    _.a=n;
    return _;
}

struct tree{
    size_t n,r,md;
    vector<vector<int>> e;
    vector<int> pa,d,sz;
    explicit tree(int n_){
        n=n_;
        e.resize(n);
    }
    void add(int a,int b){
        e[a].emplace_back(b);
        e[b].emplace_back(a);
    }
    void r_dfs(int i,int p=-1,int D=0){
        sz[i]=1;
        pa[i]=p;d[i]=D;md=max(md,(size_t)D);++D;
        for(auto j:e[i]) if(j!=p){
            r_dfs(j,i,D);
            sz[i]+=sz[j];
        }
    }
    void r_i(int r_){
        pa.resize(n);d.resize(n);sz.resize(n);r=r_;md=0;
        r_dfs(r);
    }
    int r2(){
        r_i(0);
        int m=0,M=0;
        fr(i,n) m=max(m,d[i]);
        fr(i,n) if(d[i]==m) M=i;
        pa.clear(),d.clear();
        r_i(M);
        m=0;
        fr(i,n) m=max(m,d[i]);
        return m;
    }
    modint solve(int n,int i){
        modint c;
        for(auto j:e[i]) if(sz[i]>sz[j]){
            c+=pwr(2,sz[j])-1;
        }
        c+=pwr(2,n-sz[i]);
        return pwr(2,n-1)-c;
    }
};

int main(){
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    istream& in(cin);
    ostream& out(cout);
    int n,a,b;
    in>>n;
    tree t(n);
    fr(i,n-1){
        in>>a>>b;
        t.add(--a,--b);
    }
    t.r_i(0);
    modint ans{};
    fr(i,n) ans+=t.solve(n,i);
    ans/=pwr(2,n);
    cout<<ans<<endl;
}

提出情報

提出日時
問題 F - Surrounded Nodes
ユーザ Motsu_xe
言語 C++14 (GCC 5.4.1)
得点 600
コード長 3597 Byte
結果 AC
実行時間 168 ms
メモリ 18944 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 4
AC × 30
セット名 テストケース
Sample sample_01, sample_02, sample_03, sample_04
All min_01, path1_01, path1_02, path1_03, path2_01, path2_02, path2_03, random_01, random_02, random_03, random_04, random_05, random_06, random_07, random_08, random_09, random_10, random_11, random_12, random_13, sample_01, sample_02, sample_03, sample_04, star1_01, star1_02, star1_03, star2_01, star2_02, star2_03
ケース名 結果 実行時間 メモリ
min_01 AC 1 ms 256 KiB
path1_01 AC 145 ms 16128 KiB
path1_02 AC 157 ms 17152 KiB
path1_03 AC 130 ms 17024 KiB
path2_01 AC 153 ms 18944 KiB
path2_02 AC 168 ms 17152 KiB
path2_03 AC 158 ms 18816 KiB
random_01 AC 9 ms 1280 KiB
random_02 AC 7 ms 1024 KiB
random_03 AC 2 ms 384 KiB
random_04 AC 5 ms 896 KiB
random_05 AC 2 ms 512 KiB
random_06 AC 100 ms 10624 KiB
random_07 AC 95 ms 10368 KiB
random_08 AC 109 ms 11648 KiB
random_09 AC 119 ms 13184 KiB
random_10 AC 71 ms 8320 KiB
random_11 AC 130 ms 13824 KiB
random_12 AC 126 ms 13824 KiB
random_13 AC 131 ms 13824 KiB
sample_01 AC 1 ms 256 KiB
sample_02 AC 1 ms 256 KiB
sample_03 AC 1 ms 256 KiB
sample_04 AC 1 ms 256 KiB
star1_01 AC 81 ms 12404 KiB
star1_02 AC 48 ms 7544 KiB
star1_03 AC 52 ms 7800 KiB
star2_01 AC 62 ms 8824 KiB
star2_02 AC 87 ms 12788 KiB
star2_03 AC 86 ms 12148 KiB