既然是期望,可以化成积分形式,变成
∫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
∫l1r1∫l2r2...∫lnrn∣x1+x2+x3+...+xn∣dx1dx2dx3...dxn
分母是∏i=1n(ri−li)\prod_{i=1}^n (r_i - l_i)∏i=1n(ri−li)
然后这东西显然非常难做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_iSi为x1+...+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}
r−l∫lrxdx=r−l∫l−kr−kxdx+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=1∑n(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';
}