分类讨论即可

#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. cookie的设置与取值

    设置cookie function cookie(key, value, options) { let days let time let result // A key and value were ...

  2. SAP Basis DEBUG改表数据权限角色设计

    SAP Basis DEBUG改表数据权限角色设计 项目实践中,因种种原因不得不要通过debug才能解决一些特定的问题,所以就涉及到了debug权限角色的定义了. DEBUG的权限,无非就是: 1)数 ...

  3. python爬虫步骤 (新手备学 )爬虫编程。

    Python爬虫是用Python编程语言实现的网络爬虫,主要用于网络数据的抓取和处理,相比于其他语言,Python是一门非常适合开发网络爬虫的编程语言,大量内置包,可以C Python爬虫可以做的事情 ...

  4. python数据类型(第二弹)

    针对上一篇博文提出的若干种python数据类型,笔者将在本文和后续几篇博文中详细介绍. 本文着重介绍python数据类型中的整数型.浮点型.复数型.布尔型以及空值. 对于整数型.浮点型和复数型数据,它 ...

  5. css3基础-选择器+边框与圆角+背景与渐变

    Css3选择器相关: section > div直接子元素选择器 div + article相邻兄弟选择器(在元素之后出现) div ~ article通用兄弟选择器(在元素之后出现) 属性选择 ...

  6. opencv —— copyTo 设置与操作感兴趣区域(ROI)

    感兴趣区域:ROI 对感兴趣区域进行的一系列操作,相当于直接在原图相应部分进行操作. Mat imageROI = srcImage(Rect(0,0,dstImage.cols, dstImage. ...

  7. linux版本的jdk1.8+hadoop2.9.2下载地址

    hadoop: 链接:https://pan.baidu.com/s/14AhhPYP8933tn-EfSX-i8Q 提取码:e90m jdk1.8: 链接:https://pan.baidu.com ...

  8. Window Api 通过账号密码访问共享文件夹

    using System; using System.Runtime.InteropServices; namespace PushGCodeService { public class Shared ...

  9. Python三种注释及分行换行输出

    1.单行注释 以#开头,#右边的所有东西都被当成文字说明,而不是真正要执行的程序,只是起到辅助说明作用(#后需要先添加一个空格). 单行注释写到行内代码后边,或者单独一行均可. # 我是单行注释,#号 ...

  10. Spring-Cloud微服务踩坑

    @feignclient和@requestmapping混用的时候出错 重写springmvc扫描controller时不带有@feignclient才实例化 @Configuration @Cond ...