题面
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