题面
7-1 1A. 期望逆序对
有 n 个独立的随机变量,其中 xi 的值是一个从 [ 中随机选取的整数,即对于 [ 中的任何一个整数 j,xi=j 的概率都是 (。
现在你需要给出一个长度为 n 的排列 p,那么可以得到一个长度为 n 的随机变量序列 。你的目标是让结果序列的逆序对个数的期望尽可能少。
求逆序对个数的期望的最小值。
输入格式:
第一行输入一个整数 (。
接下来 n 行每行两个整数 ,。
输出格式
输出一行一个整数,表示答案对 9 取模后的值。假设答案的最简分数表示是 yx,你需要输出一个整数 k 满足 mod 。
输入样例:
3 1 2 2 3 1 3
输出样例:
332748118
题解

1 #include <cstring>
2 #include <cstdio>
3 #include <algorithm>
4
5 #define RE register
6 #define FOR(i,a,b) for(RE int i=a;i<=b;++i)
7 #define ROF(i,a,b) for(RE int i=a;i>=b;--i)
8 #define sc(n) scanf("%d",&n)
9 #define ll long long
10 #define p pair<int,int>
11
12 using namespace std;
13
14 const int N = 5100;
15 const int mod = 998244353;
16
17 struct atom
18 {
19 int l,r;
20 void scan(){sc(l), sc(r);}
21 }A[N];
22
23 int operator < (atom k1,atom k2)
24 {
25 return k1.l + k1.r < k2.l + k2.r;
26 }
27
28 int n, inv[N];
29
30 int quick(int k1, int k2)
31 {
32 int k3 = 1;
33 while (k2)
34 {
35 if (k2 & 1) k3 = 1ll * k3 * k1 % mod;
36 k2 >>= 1;
37 k1 = 1ll * k1 * k1 % mod;
38 }
39 return k3;
40 }
41
42 int calc(atom k1, atom k2)
43 {
44 int l = max(k1.l, k2.l);
45 if (l > k1.r) return 0;
46 int r = min(k1.r, k2.r);
47 int ans = 1ll * (l - k2.l + r - k2.l) * (r - l + 1) / 2 % mod;
48 ans = (ans + 1ll * (k1.r - r) * (k2.r - k2.l + 1)) % mod;
49 return ans;
50 }
51
52 //a ^(p − 2) mod p =a ^ −1 mod p, a ^ {p - 2} mod p = a ^ {-1} mod pa
53 //(b / a) % p = b ∗ a ^−1 % p = b ∗ a ^ (p − 2) % p
54
55 int main()
56 {
57 sc(n);
58 FOR(i,1,n) A[i].scan();
59 sort(A + 1, A + n + 1);
60 int ans = 0;
61 FOR(i,1,n) inv[i] = quick(A[i].r - A[i].l + 1, mod - 2);
62 FOR(i,1,n)
63 FOR(j,1 + i,n)
64 ans = (ans + 1ll * inv[i] * inv[j] % mod * calc(A[i], A[j])) % mod;
65 printf("%d\n", ans);
66 return 0;
67 }
来源:https://www.cnblogs.com/2aptx4869/p/12196150.html