hdu6836 Expectation 2020杭电hdu多校第6场

http://acm.hdu.edu.cn/showproblem.php?pid=6836

与运算显然按位考虑,每次把当前枚举位i为1的边全部拿出来,那么这一位的总贡献就是2^i*生成树数量,生成树数量可以用矩阵树定理算出来。

最后把每一位的贡献加起来,除以所有边算出来的生成树数量。

#include
using namespace std;
const int mod=998244353;
long long a[33][105][105];
long long inv(long long x){
    return x==1?x:(mod-mod/x)*inv(mod%x)%mod;
}
long long cal(long long a[105][105],int n){
    for(int i=1;i=mod)a[i][j]-=mod;
        }
    }
    for(int i=1;i>j)&1){
                    a[j][u][u]++;
                    a[j][v][v]++;
                    a[j][u][v]--;
                    a[j][v][u]--;
                }
            }
            a[31][u][u]++;
            a[31][v][v]++;
            a[31][u][v]--;
            a[31][v][u]--;
        }
        long long P=0,Q=cal(a[31],n);
        for(int i=0;i<=30;i++){
            P=(P+cal(a[i],n)*(1LL<

 

你可能感兴趣的:(矩阵树定理,二进制)