2020 camp day-1-A

耗尽温柔 提交于 2020-01-15 13:39:44

题面

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 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!