hdu6309 Absolute 容斥

博客探讨了如何将期望问题转化为积分形式,并解决了一个涉及绝对值的积分难题。通过容斥原理,文章详细解释了如何处理绝对值,将问题转化为多个积分的求和,特别是当变量数量相对较小(如15个)时。作者还介绍了如何利用积分转换简化下界,并展示了如何处理满足偏序关系的变量。最终,通过DFS解决这个问题的方法被提出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

既然是期望,可以化成积分形式,变成
∫l1r1∫l2r2...∫lnrn∣x1+x2+x3+...+xn∣dx1dx2dx3...dxn \int_{l_1}^{r_1} \int_{l_2}^{r_2} ...\int_{l_n}^{r_n} | x_1 + x_2 + x_3 + ... + x_n|dx_1 dx_2 dx_3...dx_n l1r1l2r2...lnrnx1+x2+x3+...+xndx1dx2dx3...dxn
分母是∏i=1n(ri−li)\prod_{i=1}^n (r_i - l_i)i=1n(rili)
然后这东西显然非常难做x
但是我们发现nnn只有151515
我们就可以考虑容斥,但是这个绝对值让我们完全不会怎么对x1,x2,...,xnx_1, x_2, ...,x_nx1,x2,...,xn容斥
然后租酥雨写了份详细的手写版,于是学会了
∣x∣=max(x,0)−min(x,0) |x|=max(x,0) - min(x,0) x=max(x,0)min(x,0)
我们可以设SiS_iSix1+...+xnx_1+...+x_nx1+...+xn
那么可以化为
∫l1r1...∫lnrnmax(Sn,0)dSn...dS1 \int_{l_1}^{r_1}...\int_{l_n}^{r_n} max(S_n, 0) dS_n ... dS_1 l1r1...lnrnmax(Sn,0)dSn...dS1
这里体会一下意思就好了,被积的东西不是很正确(但是又不太会表达,主要是要满足偏序,所以还要除以一个东西
对于min(x,0)min(x,0)min(x,0)同理
你可以对下界容斥
因为
∫lrxdxr−l=∫l−kr−kxdx+kr−l \frac{\int_l^r xdx}{r - l}=\frac{\int_{l - k}^{r - k} x dx + k}{r - l} rllrxdx=rllkrkxdx+k
这里直接积分就可以证明,所以我们可以把上界统一移到000
因为我们容斥至少有KKK个数不满足下界,也就是在[−∞,li][-\infin,l_i][,li]之间
那么式子就会变成
∫−∞0...∫−∞0Sn+∑i=1n(select[i]?ri:li)dSn...dS1 \int_{-\infin}^{0}...\int_{-\infin}^{0} S_n + \sum_{i = 1}^n (select [i] ? r_i : l_i) dS_n ... dS_1 0...0Sn+i=1n(select[i]?ri:li)dSn...dS1
这时候大力积分就会变成(因为SiS_iSi之间要满足偏序关系,于是要除以分母)
(∑i=1n(select[i]?ri:li))n+1(n+1)!\frac{(\sum_{i = 1}^n (select [i] ? r_i : l_i))^{n + 1}}{(n+1)!}(n+1)!(i=1n(select[i]?ri:li))n+1
然后我们就大力dfs就好了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstring>

using namespace std;

int const mod = 998244353;

int KSM(int a, int k) {
	int ret = 1;
	for (; k; k >>= 1, a = 1ll * a * a % mod)
		if (k & 1)
			ret = 1ll * ret * a % mod;
	return ret;
}

int l[20], r[20];
int n;

void dfs(int k, int s, int f1, int f2, int& ans1, int& ans2) {
	if (k > n) {
		if (s > 0) 
			ans1 = (1ll * ans1 + 1ll * f1 * KSM(s, n + 1) % mod) % mod;
		if (s < 0) 
			ans2 = (1ll * ans2 + 1ll * f2 * KSM(-s, n + 1) % mod) % mod;
		return;
	}
	dfs(k + 1, s + l[k], -f1, f2, ans1, ans2);
	dfs(k + 1, s + r[k], f1, -f2, ans1, ans2);
}

int main() {
	cin >> n;
	int fm = KSM(n + 1, mod - 2);
	for (int i = 1; i <= n; ++i) {
		cin >> l[i] >> r[i];
		fm = 1ll * fm * KSM(r[i] - l[i], mod - 2) % mod * KSM(i, mod - 2) % mod;
	}
	int ans1 = 0, ans2 = 0;
	dfs(1, 0, 1, -1, ans1, ans2);
	cout << (1ll * (ans1 - ans2) % mod * fm % mod + mod) % mod << '\n';
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值