首页 > 其他分享 >[CF1753C]Wish I Knew How to Sort

[CF1753C]Wish I Knew How to Sort

时间:2022-10-25 08:00:12浏览次数:56  
标签:Sort 右边 CF1753C 左边 ll How base 序列 mod

做题时间:2022.10.25

\(【题目描述】\)

给定一个长度为 \(n\) 的01序列 \(a\) 和一种操作,你需要用这种操作将序列从小到大排序。操作为:等概率随机选择两个位置 \(i,j(i<j)\),若 \(a_i>a_j\),则交换 \(a_i\) 和 \(a_j\)(当 \(a_i\leq a_j\),交换失败也算一次操作)

求出执行操作的期望次数,对 \(998244353\) 取模

\(【输入格式】\)

第一行一个整数 \(T\) 表示数据组数

每组数据第一行一个整数 \(n\) 表示序列长度

接下来一行 \(n\) 个整数表示序列 \(a\)

\(【输出格式】\)

对于每组数据,输出一行一个整数表示答案

\(【考点】\)

期望、概率

\(【做法】\)

最终单调不降的目标序列肯定是 00...00111...111,交换过程就是以中间的 \(0\) 和 \(1\) 为分界线,左边的 \(1\) 全部移动到右边,右边的 \(0\) 全部移动到左边,根据期望线性性质,我们可以单独考虑每一次操作,最后将每次操作的期望值加起来即可。

设当前分界线左边有 \(i\) 个 \(1\),则分界线右边会有 \(i\) 个 \(0\),交换一次左边的 \(1\) 和右边的 \(0\) 的概率为:

\[\frac{i^2}{\binom{n}{2}} \]

而期望是概率的倒数,因此最终我们要求的便是:

\[\sum\limits_{i=1}^k \frac{\binom{n}{2}}{i^2} \]

其中 \(k\) 是一开始分界线左边的 \(1\) 数量(右边的 \(0\) 数量)

\(【代码】\)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+50;
const ll mod=998244353;
int n,a[N],cnt,k,t;
ll Pow(ll a,ll b)
{
    ll ans=1ll,base=a%mod;
    while(b){
        if(b&1) ans*=base,ans%=mod;
        base*=base,base%=mod;
        b>>=1;
    }
    return ans;
}
void Wish()
{
    cnt=0,k=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]),cnt+=(a[i]==0);//计算分界线
    for(int i=1;i<=cnt;i++){
        if(a[i]) k++;
    }
    ll ans=0;
    for(int i=1;i<=k;i++){//计算答案
        ans+=1ll*n*(n-1)%mod*Pow(2ll*i*i,mod-2)%mod;
        ans%=mod;
    }
    printf("%lld\n",ans);
}
int main()
{
    scanf("%d",&t);
    while(t--) Wish();
    return 0;
}

标签:Sort,右边,CF1753C,左边,ll,How,base,序列,mod
From: https://www.cnblogs.com/Unlimited-Chan/p/16823701.html

相关文章

  • How to detect if you are in Incognito mode in Google Chrome with JavaScript
    varfs=window.RequestFileSystem||window.webkitRequestFileSystem;if(!fs){console.log("checkfailed?");}else{fs(window.TEMPO......
  • HashSet集合 Array sort方法 学习 剑指offer 练习1
    HashSet集合是基于HashMap来实现的,不允许有重复的元素        允许有NULL值 无序,不会记录插入的顺序HashSet实例化对象  HashSet<Strin......
  • HowToImpleteINotifyDataErrors
    howtoimplementINotifyDataErrorInfoMVVM目前实现datavalidation有两种方式,一种是通过xaml,还有就是通过viewmodel.xaml的实现方式如下。这种情况下,viewmodel不......
  • Codeforces Round #829 (Div. 2) E Wish I Knew How to Sort
    WishIKnewHowtoSort概率dp设计一个\(dp[i]\)表示还需要进行\(i\)次有效移动的概率何为有效移动?最后的数组是\(0\)在左边,\(1\)在右边因此只有把两个在错误......
  • ctfshow web181(sql注入where后运算符优先级利用)
    //拼接sql语句查找指定ID用户$sql="selectid,username,passwordfromctfshow_userwhereusername!='flag'andid='".$_GET['id']."'limit1;";//对传入的参数......
  • directshow(directShow多个usb摄像头方案)
    DirectShow评价是什么?DirectShow评价编辑播放一个文件是一项相对简单的任务,不过对于像是从视频窗口接收特定窗口信息到创建特定filters,开发者会不断地遇到DirectShowAPI的黑......
  • PHP array_multisort 多维数组排序的理解
    array_multisort(array1,sortingorder,sortingtype,array2,array3...) 1.数组从前往后,依次排序;前一组数中值相同时,才考虑后一个数组中的值排序;2.任一数组排序变......
  • How to get the ASCII value of a character Python
    HowtogettheASCIIvalueofacharacter 回答1Fromhere:Thefunctionord()getstheintvalueofthechar.Andincaseyouwanttoconvertbackafterp......
  • Shell细说sort排序
    sort是在Linux里非常常用的一个命令,管排序sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。使用方法:so......
  • List.sort 排序方法使用
     在数据库中取出的List<Map<Strng,Object>>现在根据Map里面的时间字段进行排序代码:list.sort(newComparator<Map<String,Object>>(){@Overridepublicin......