首页 > 其他分享 >CF1067E Random Forest Rank

CF1067E Random Forest Rank

时间:2023-03-11 15:34:11浏览次数:39  
标签:ch int CF1067E Random while read 1ll Forest mod

非常神秘题。

考虑 \(\operatorname{rank} A = n\) 当且仅当 \(\det A \neq 0\),我们把 \(\det A\) 写下来:

\[\sum_{p} (-1)^{\pi(p)} \prod_{i=1}^n A_{i,p_i} \]

考虑这是个森林的邻接矩阵,排列 \(p\) 有贡献当且仅当 \(p\) 仅包含大小等于 \(2\) 的环。放在树上来看恰好对应了一组完美匹配。于是 \(\operatorname{rank} A=\) 最大匹配大小 \(\times 2\)。

直接考虑拆贡献 dp,设 \(f_i\) 表示 \(i\) 与一个儿子匹配的概率,非常好计算。

#include <bits/stdc++.h>

using namespace std;

const int N = 5e5 + 5, mod = 998244353;

inline int read() {
	register int s = 0, f = 1; register char ch = getchar();
	while (!isdigit(ch)) f = (ch == '-' ? -1 : 1), ch = getchar();
	while (isdigit(ch)) s = (s * 10) + (ch & 15), ch = getchar();
	return s * f;
}

inline int power(int a, int b) {
	int t = 1, y = a, k = b;
	while (k) {
		if (k & 1) t = (1ll * t * y) % mod;
		y = (1ll * y * y) % mod; k >>= 1;
	} return t;
}

struct edge {
	int head, to, nxt;
} ed[N << 1];

int en = 0;

inline void addedge(int from, int to) {
	ed[++en].to = to; ed[en].nxt = ed[from].head; ed[from].head = en;
}

int f[N];

const int inv2 = power(2, mod - 2);

int ans = 0, n;

inline void dfs(int now, int fa) {
	f[now] = 1;
	for (int i = ed[now].head; i; i = ed[i].nxt) {
		int v = ed[i].to;
		if (v == fa) continue;
		dfs(v, now);
		f[now] = 1ll * (1 + f[ed[i].to]) * (1ll * f[now] * inv2 % mod) % mod;
	} ans += (f[now] = (1 + mod - f[now])) % mod;
	if (ans >= mod) ans -= mod;
}

int main() {
	n = read();
	for (int i = 1, u, v; i < n; ++i) {
		u = read(); v = read();
		addedge(u, v); addedge(v, u);
	} dfs(1, 0);
	printf("%d\n", 1ll * ans * power(2, n) % mod);
	return 0;
}

标签:ch,int,CF1067E,Random,while,read,1ll,Forest,mod
From: https://www.cnblogs.com/wwlwakioi/p/17206143.html

相关文章

  • random模块
    1使用==》importrandom#随机小数2用法random.random()  #大于零且小于1的小数 random.uniform(start,stop)==》(start,stop是整数) #大于start小于stop的小数r......
  • 随机模块random
    验证码的实现:choice是选择列表中任意一个##记得把randint取出来的数字转化成str类型,要不就会相加##cha()是把asc编码表里的数字转化成字符更进一步做成函数形式ssample......
  • np.random.normal 正态分布(Normal distribution)
    正态分布(Normaldistribution),也称“常态分布”,又名高斯分布(Gaussiandistribution),最早由棣莫弗(AbrahamdeMoivre)在求二项分布的渐近公式中得到。C.F.高斯在研究测量误差时......
  • S2 - Lesson 44 - Through the forest
    Words forest possession risk breath picnic contents edge mend strap       Content ThroughtheforestMrs.AnneSterl......
  • Paper Reading: An Evolutionary Forest for Regression
    目录研究动机文章贡献进化森林算法整体框架个体设计交叉变异适应度评估选择算子精英保留实验分析数据集和基线方法特征构建比较算法性能比较参数设置的影响算法组件的选择......
  • Numpy之random.randint产生随机整数
    前言本文主要讲述了如何使用Numpy的random.randint来产生随机整数,我们演示了如何生成不同上限或下限的指定大小的数组方法numpy.random.randint(low,high=None,s......
  • 380. Insert Delete GetRandom O(1)
    380.InsertDeleteGetRandomO(1)标签(空格分隔):leetcodearraymedium题目DesignadatastructurethatsupportsallfollowingoperationsinaverageO(1)......
  • np.random.seed(0)有什么用?
    np.random.seed(0)使随机数可预测>>>numpy.random.seed(0);numpy.random.rand(4)array([0.55,0.72,0.6,0.54])>>>numpy.random.seed(0);numpy.random.ran......
  • R语言随机森林RandomForest、逻辑回归Logisitc预测心脏病数据和可视化分析|附代码数据
    全文链接:http://tecdat.cn/?p=22596最近我们被客户要求撰写关于预测心脏病数据的研究报告,包括一些图形和统计输出。本报告是对心脏研究的机器学习/数据科学调查分析。更......
  • java - Random18
    猜数字案例packagecom.demo.test;importjava.util.Random;importjava.util.Scanner;publicclassrr{publicstaticvoidmain(String[]args){......