分类讨论即可

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5005;
const int mod = 998244353;
int i2;
int qpow(int p,int q) {
int b=p,r=1;
while(q>0) {
if(q&1) r*=b;
b*=b;
r%=mod;
b%=mod;
q>>=1;
}
return r;
}
int inv(int x) {
return qpow(x,mod-2);
} struct seg {
int l,r,inv;
int len() {
return r-l+1;
}
seg operator + (const seg &b) {
seg c;
c.l = min(l,b.l);
c.r = max(r,b.r);
return c;
}
seg operator * (const seg &b) {
seg c;
c.l = max(l,b.l);
c.r = min(r,b.r);
return c;
}
bool operator < (const seg &b) {
return (l+r) < (b.l+b.r);
}
} a[N]; struct num {
int x;
num() {
x=0;
}
num(int t) {
x=t;
}
num operator + (const num &b) {
num c;
c.x = x + b.x;
c.x %= mod;
return c;
}
num operator - (const num &b) {
num c;
c.x = x - b.x;
c.x %= mod;
c.x += mod;
c.x %= mod;
return c;
}
num operator * (const num &b) {
num c;
c.x = x * b.x;
c.x %= mod;
return c;
}
num operator / (const num &b) {
num c;
if(b.x==2)
c.x = x * i2;
else
c.x = x * inv(b.x);
c.x %= mod;
return c;
}
num operator / (const seg &b) {
num c;
c.x = x * b.inv;
c.x %= mod;
return c;
}
void operator = (const int &b) {
x = b;
}
void operator = (const num &b) {
x = b.x;
}
num operator + (const int &b) {
num c;
c.x = x + b;
c.x %= mod;
return c;
}
num operator - (const int &b) {
num c;
c.x = x - b;
c.x %= mod;
return c;
}
num operator * (const int &b) {
num c;
c.x = x * b;
c.x %= mod;
return c;
}
num operator / (const int &b) {
num c;
c.x = x * inv(b);
c.x %= mod;
return c;
}
int get() {
return x;
}
}; int n; num calc(seg a,seg b) {
if(a.r<b.l) return num(0);
if(b.r<a.l) return num(1);
if(a.l>=b.l && a.r<=b.r) { //cout<<"A";
return (num(a.l-b.l)+num(a.r-a.l)/num(2))/b;
}
if(b.l>=a.l && b.r<=a.r) { //cout<<"B";
return (num(a.r-b.r)+num(b.r-b.l)/num(2))/a;
}
if(a.l>=b.l && b.r<=a.r) { //cout<<"C";
return num(1)-num(b.r-a.l+1)*num(b.r-a.l+2)/num(2)/b/a;
}
if(b.l>=a.l && a.r<=b.r) { //cout<<"D";
return num(a.r-b.l)*num(a.r-b.l+1)/num(2)/b/a;
}
} num check(seg a,seg b) {
num x;
for(int i=a.l;i<=a.r;i++) {
for(int j=b.l;j<=b.r;j++) {
if(j<i) x=x+1;
}
}
x=x/((a.r-a.l+1)*(b.r-b.l+1));
return x;
} signed main() {
i2=inv(2);
scanf("%lld",&n);
//for(int i=1;i<=n;i++) arrinv[i]=__inv(i);
for(int i=1;i<=n;i++) {
int t1,t2;
scanf("%lld%lld",&t1,&t2);
a[i].l=t1;
a[i].r=t2;
a[i].inv=inv(a[i].r-a[i].l+1);
}
sort(a+1,a+n+1);
num ans = 0;
/*for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
cout<<(calc(a[i],a[j])).get()<<" ";
}
cout<<endl;
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
cout<<(check(a[i],a[j])).get()<<" ";
}
cout<<endl;
}*/ for(int i=2;i<=n;i++) {
for(int j=1;j<i;j++) {
ans = ans + calc(a[j],a[i]);
}
}
cout<<ans.get()<<endl;
}

Wannafly Camp 2020 Day 1A 期望逆序对 - 概率期望的更多相关文章

  1. 计数 luogu 4223 期望逆序对

    https://www.luogu.org/problemnew/show/P4223 期望乘以\(\binom {n}{2}^k\)变成了计数问题 我们考虑每一组数\((A, B)\)产生的贡献CC ...

  2. BZOJ5058 期望逆序对 【矩乘 + 组合数学 + 树状数组】

    题目链接 BZOJ5058 题解 可以发现任意两个位置\(A,B\)最终位置关系的概率是相等的 如果数列是这样: CCCCACCCCBCCCC 那么最终有\(7\)种位置关系 \((A,B)\) \( ...

  3. Wannafly Camp 2020 Day 3I N门问题 - 概率论,扩展中国剩余定理

    有一个猜奖者和一个主持人,一共有 \(n\) 扇门,只有一扇门后面有奖,主持人事先知道哪扇门后有奖,而猜奖者不知道.每一轮,猜奖者选择它认为的有奖概率最大(如果有多个最大,随机选一个)的一扇门,主持人 ...

  4. Wannafly Camp 2020 Day 3F 社团管理 - 决策单调性dp,整体二分

    有 \(n\) 个数构成的序列 \({a_i}\),要将它划分为 \(k\) 段,定义每一段的权值为这段中 \((i,j) \ s.t. \ i<j,\ a_i=a_j\) 的个数,求一种划分方 ...

  5. Wannafly Camp 2020 Day 3D 求和 - 莫比乌斯反演,整除分块,STL,杜教筛

    杜教筛求 \(\phi(n)\), \[ S(n)=n(n+1)/2-\sum_{d=2}^n S(\frac{n}{d}) \] 答案为 \[ \sum_{d=1}^n \phi(d) h(\fra ...

  6. Wannafly Camp 2020 Day 2B 萨博的方程式 - 数位dp

    给定 \(n\) 个数 \(m_i\),求 \((x_1,x_2,...,x_n)\) 的个数,使得 \(x_1 \ xor\ x_2\ xor\ ...\ xor\ x_n = k\),且 \(0 ...

  7. Wannafly Camp 2020 Day 2D 卡拉巴什的字符串 - 后缀自动机

    动态维护任意两个后缀的lcp集合的mex,支持在串末尾追加字符. Solution 考虑在 SAM 上求两个后缀的 LCP 的过程,无非就是找它们在 fail 树上的 LCA,那么 LCP 长度就是这 ...

  8. Wannafly Camp 2020 Day 1D 生成树 - 矩阵树定理,高斯消元

    给出两幅 \(n(\leq 400)\) 个点的无向图 \(G_1 ,G_2\),对于 \(G_1\) 的每一颗生成树,它的权值定义为有多少条边在 \(G_2\) 中出现.求 \(G_1\) 所有生成 ...

  9. Wannafly Camp 2020 Day 2I 堡堡的宝藏 - 费用流

    感谢这道题告诉我KM求的是 完备 最大权匹配 :( #include <bits/stdc++.h> using namespace std; #define reset(x) memse ...

随机推荐

  1. python3-cookbook笔记:第九章 元编程

    python3-cookbook中每个小节以问题.解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构.函数.类等特性在某类问题上如何更好地使 ...

  2. linux 命令行下设置代理

    当linux 代理软件设置好后,我们需要设置命令行代理的连接方式,这样在命令行中的软件才能使用: 设置http/https代理: export https_proxy="127.0.0.1: ...

  3. winform重绘控件边框

    首先添加一个用户控件 对于重绘边框有三个需要考虑的东西 1:是否显示边框 2:边框颜色 3:边框宽度 所以定义三个私有变量 /// <summary>/// 是否显示边框/// </ ...

  4. 【STM32H7教程】第46章 STM32H7的ADC应用之DMA方式多通道采样

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第46章       STM32H7的ADC应用之DMA方式多 ...

  5. C#设计模式学习笔记:(8)装饰模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7723225.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第三个模式--装 ...

  6. Node中使用MongoDB

    简介 MongoDB 中文文档 MongoDB是一个介于关系数据库和非关系数据库(nosql)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. Mongoose 在Node中可以使用 Mo ...

  7. JS DOM中getElement系列和querySelector系列获取节点

    节点查找方法 document.getElementById() 前面必须是document document.getElementsByName()  前面必须是document ele.getEl ...

  8. PHP操作mysql(mysqli + PDO)

    [Mysqli面向对象方式操作数据库] 添加.修改.删除数据 $mysqli ','test'); $mysqli->query('set names utf8'); //添加数据 $resul ...

  9. ACM模板_axiomofchoice

    目录 语法 c++ java 动态规划 多重背包 最长不下降子序列 计算几何 向量(结构体) 平面集合基本操作 二维凸包 旋转卡壳 最大空矩形 | 扫描法 平面最近点对 | 分治 最小圆覆盖 | 随机 ...

  10. P2746 [USACO5.3]校园网Network of Schools [tarjan缩点]

    题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 BB 在 AA 学校的分发列表中,AA 也不一定在 BB 学校的列表中. ...