首页 > 其他分享 >P9346 无可奈何花落去 题解

P9346 无可奈何花落去 题解

时间:2024-12-10 18:33:44浏览次数:3  
标签:tmp int 题解 add P9346 fac 无可奈何花落去 dp mod

P9346 无可奈何花落去 题解

这个期望第一眼看上去是困难的。然而发现 \(E=Px\),贡献 \(x\) 是可枚举的,于是转化为了一个求概率的问题。这个概率同样难以计算,然而发现状态的个数是有限的,对于选取 \(x\) 条边断掉它的总方案数就是 \({n-1\choose x}\),那么直接求方案数就可以了。

想到了这些转化这题基本就做完了。直接暴力树上背包设 \(dp_{i,j,0/1/2}\) 表示 \(i\) 点为根的子树内,断掉了 \(j\) 条边,\(i\) 和 \(0/1/2\) 种儿子相连的方案数,最终算出 \(f_i=\frac{\sum dp_j}{{n-1\choose x}}\)。注意到我们求的断 \(i\) 跳边的情况事实上包含了跳 \(0\sim i-1\) 条边的情况,于是做的时候减去 \(\sum_0^{i-1}f_i\) 即可。具体实现的时候可以前缀和累加去算,但其实不前缀和也不影响复杂度。

代码:

#include <bits/stdc++.h>
#define N 5005
#define int long long
#define mod 985661441
using namespace std;
int n;
vector<int>v[N];
signed dp[N][N][3];
int tmp[N][3];
void add(int &x, int y) {
	x = (x + y) % mod;
}
int siz[N];
void dfs(int x) {
	siz[x] = 1;
	dp[x][0][0] = 1;
	for (int y : v[x]) {
		dfs(y);
		for (int j = 0; j < siz[x]; j++)
			for (int k = 0; k < siz[y]; k++) {
				int p = (0ll + dp[y][k][0] + dp[y][k][1] + dp[y][k][2]) % mod, q = (0ll + dp[y][k][0] + dp[y][k][1]) % mod;
				add(tmp[j + k + 1][0], dp[x][j][0] * p % mod);
				add(tmp[j + k + 1][1], dp[x][j][1] * p % mod);
				add(tmp[j + k][1], dp[x][j][0] * q % mod);
				add(tmp[j + k + 1][2], dp[x][j][2] * p % mod);
				add(tmp[j + k][2], dp[x][j][1] * q % mod);
			}
		for (int j = 0; j < N; j++)
			for (int k = 0; k < 3; k++) 
				dp[x][j][k] = tmp[j][k], tmp[j][k] = 0;
		siz[x] += siz[y];
	}
}

int fac[N], inv[N];
int qpow(int x, int y) {
	int ans = 1;
	while (y) {
		if (y & 1) ans = ans * x % mod;
		x = x * x % mod;
		y >>= 1;
	}
	return ans;
}
int C(int n, int m) {
	return fac[n] * inv[m] % mod * inv[n - m] % mod;
}
int res;
int f[N];
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	fac[0] = 1;
	for (int i = 1; i < N; i++) fac[i] = fac[i - 1] * i % mod;
	inv[N - 1] = qpow(fac[N - 1], mod - 2);
	for (int i = N - 2; ~i; --i) inv[i] = inv[i + 1] * (i + 1) % mod;
	cin >> n;
	for (int i = 2; i <= n; i++) {
		int x;
		cin >> x;
		v[x].push_back(i);
	}
	dfs(1);
	for (int i = 0; i < n; i++) {
		add(f[i], 0ll + dp[1][i][0] + dp[1][i][1] + dp[1][i][2]);
		f[i] = f[i] * qpow(C(n - 1, i) , mod - 2) % mod;
		add(res, (f[i] - f[i - 1] + mod) % mod * i % mod);
	}
	cout << res << "\n";
	return 0;
}

标签:tmp,int,题解,add,P9346,fac,无可奈何花落去,dp,mod
From: https://www.cnblogs.com/Rock-N-Roll/p/18597828

相关文章

  • Shopee虾皮新手小白必读:十大常见问题解答
     随着跨境电商的兴起,越来越多的新手卖家选择在Shopee(虾皮)平台上开店。以下是针对Shopee新手小白的十大常见问题及其解答,帮助您快速上手,顺利开启您的电商之旅。问题一:没有完成新手任务有什么影响?答:若没有完成,你将会错过对接专属客户经理的机会及部分活动资源。开新店、报名......
  • 题解:P11377 [GESP202412 七级] 武器购买
    思路这是一个典型的背包问题。我们可以设\(dp_{j}\)为武器总强度为\(j\)的情况下的最小花费。于是,根据背包问题的模型我们就能得出:\[dp_j=\max_{1\lei\len}dp_{j-c_i}+p_i\]最终,答案就为第一个大于等于\(P\)的\(dp_j\)的下标\(j\)。时间复杂度为\(O(Tn......
  • CF1601 题解
    纪念一下场切5题。A给定序列\(a\),一次操作可选\(k\)个数,同时减去它们的按位与。问有多少个\(k\)能把\(a\)全消为\(0\)。\(n\le10^5\)。对于一个位,\(1\)的个数的变化量必为\(k\)的倍数。所以\(k\)要是每一位\(1\)的个数的\(gcd\)的因数。B青蛙跳井,初始......
  • Java 架构师面试题解析(2024 年版)
    在当今竞争激烈的技术领域,成为一名Java架构师需要具备深厚的技术功底和丰富的实践经验。为了帮助大家更好地准备Java架构师面试,本文整理了一些2024年常见的面试题及答案解析。一、基础篇1.谈谈你对面向对象编程三大特性的理解?封装:将数据和操作封装在类中,通过访问修......
  • CF2040D Non Prime Tree 题解
    CF992Div2D-solution给定一个\(n\)个节点的树,你可以不重复地给树的节点填\(1\sim2n\)之间的数,求一种构造方案,使得每两个相邻的节点上的数之差的绝对值为合数。我们规定每次填的数只会变大(就是在以某种方法遍历的时候后面的数一定比前面的数大)。现在我们假设填到了\(u\)......
  • SpringBoot开发过程中经常遇到问题解决方案分享
    目录1. SpringBoot应用启动缓慢2. 数据库连接池配置问题3. SpringBoot应用无法连接外部服务4. 配置文件读取不生效5. SpringBoot应用的日志输出不完整6. SpringBoot中的@Transactional事务管理问题1. SpringBoot应用启动缓慢问题原因:SpringBoot应用启......
  • [ARC189B] Minimize Sum 题解
    场上被创死了。思路考虑一次操作会造成什么影响。加入操作的是:\[x_1,x_2,x_3,x_4\]它们会变成:\[x_1,x_1+x_4-x_3,x_1+x_4-x_2,x_4\]发现没有什么规律。考虑它们的差分序列:\[x_1,x_4-x_3,x_3-x_2,x_2-x_1\]改变为交换\(2,4\)的差分。那么修改就变成很简单的形式了。......
  • 题解:P11266 【模板】完全体·堆
    题目链接洛谷P11266【模板】完全体·堆解题思路看了题解区,竟然没有人写可爱的左偏树。我们需要支持四种操作:删除集合中的元素。取集合中的最小值。合并两个集合。修改集合中的元素。那么我们可以用常数极小的左偏树(可并堆)来解决这道模板题。对于左偏树的基础操作......
  • HECTF网络安全挑战赛个人题解,主Reverse部分
    ReverseezAndroid比较难的一个题。java层用rc4解出一张图片知道flag的格式so层注册了d0func和stringFromJNI两个函数其中d0func给两个全局变量赋了值,还有两个小函数也对这两个变量进行了操作,交叉引用全部找出来即可解密得到1vxyzmissonD1key和go1denG08aTJYcxk在stringFro......
  • 基于验证链(Chain of Verification)的大语言模型幻觉问题解决方案
    LLM(SEALONG:LLM(LargeLanguageModel)在长上下文推理任务中的自我改进)在生成内容时往往会遭遇一个棘手的问题——幻觉(Hallucination)。模型自信地输出虚假或误导性信息,对依赖其准确输出的开发者、工程师及用户构成了实质性的挑战。为解决这一问题,研究者提出了ChainofVerificat......