hdu6309 Absolute 容斥

既然是期望,可以化成积分形式,变成
∫ l 1 r 1 ∫ l 2 r 2 . . . ∫ l n r n ∣ x 1 + x 2 + x 3 + . . . + x n ∣ d x 1 d x 2 d x 3 . . . d x n \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 = 1 n ( r i − l i ) \prod_{i=1}^n (r_i - l_i) i=1n(rili)
然后这东西显然非常难做x
但是我们发现 n n n只有 15 15 15
我们就可以考虑容斥,但是这个绝对值让我们完全不会怎么对 x 1 , x 2 , . . . , x n x_1, x_2, ...,x_n x1,x2,...,xn容斥
然后租酥雨写了份详细的手写版,于是学会了
∣ x ∣ = m a x ( x , 0 ) − m i n ( x , 0 ) |x|=max(x,0) - min(x,0) x=max(x,0)min(x,0)
我们可以设 S i S_i Si x 1 + . . . + x n x_1+...+x_n x1+...+xn
那么可以化为
∫ l 1 r 1 . . . ∫ l n r n m a x ( S n , 0 ) d S n . . . d S 1 \int_{l_1}^{r_1}...\int_{l_n}^{r_n} max(S_n, 0) dS_n ... dS_1 l1r1...lnrnmax(Sn,0)dSn...dS1
这里体会一下意思就好了,被积的东西不是很正确(但是又不太会表达,主要是要满足偏序,所以还要除以一个东西
对于 m i n ( x , 0 ) min(x,0) min(x,0)同理
你可以对下界容斥
因为
∫ l r x d x r − l = ∫ l − k r − k x d x + k r − l \frac{\int_l^r xdx}{r - l}=\frac{\int_{l - k}^{r - k} x dx + k}{r - l} rllrxdx=rllkrkxdx+k
这里直接积分就可以证明,所以我们可以把上界统一移到 0 0 0
因为我们容斥至少有 K K K个数不满足下界,也就是在 [ − ∞ , l i ] [-\infin,l_i] [,li]之间
那么式子就会变成
∫ − ∞ 0 . . . ∫ − ∞ 0 S n + ∑ i = 1 n ( s e l e c t [ i ] ? r i : l i ) d S n . . . d S 1 \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
这时候大力积分就会变成(因为 S i S_i Si之间要满足偏序关系,于是要除以分母)
( ∑ i = 1 n ( s e l e c t [ i ] ? r i : l i ) ) 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 
#include 
#include 
#include 
#include 
#include 

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';
}

你可能感兴趣的:(容斥)