首页 > 其他分享 >ABC295 E

ABC295 E

时间:2023-04-02 17:15:00浏览次数:42  
标签:int ll ge need include ABC295 mod

ABC295 E

给你一个长度为 \(N\) 的序列 \(A\) 满足 \(\forall i\in [1,N],A_i\in[0,M]\),其中 \(M\) 是一个给定的常数

执行以下两种操作

  1. 不断把序列中的一个 \(0\) 换成在 \([1, M]\) 中均匀随机的一个数,直到序列中没有 \(0\)
  2. 对整个序列升序排序

求序列第 \(K\) 个数的期望值,对 \(998244353\) 取模

考虑从权值的角度去做

假设 \(X\) 可以在 \([1, M]\) 内取值,为 \(i\) 的概率是 \(p_i\), 则 \(X\) 的期望值是:

\[E(X)=\sum_{i=1}^M i \times p_i \]

发现 \(p_M\) 被加了 \(M\) 次, \(p_{M-1}\) 被加了 \(M-1\) 次,\(p_{M-2}\) 被加了 \(M-2\) 次……

一个类似后缀和之和的东西,可以写成

\[E(X)=\sum_{i=1}^{M}\sum_{j=i}^{M} p_j \]

的形式

所以也就是

\[E(X)=\sum_{i=1}^{M}P(X\ge i) \]

考虑枚举权值 \(X\),那就只用算出对于每个 \(X\) 有 \(A_k\ge X\) 的概率即可
这相当于在操作 \(1\) 之后至少有 \(N+1-K\) 个 \(j\) 令 \(A_j\ge X\)
那二项式分布即可,减去原序列非 \(0\) 已经 \(\ge X\) 的个数,剩下的记为 \(p\),再算出随机的数中至少有 \(p\) 个 \(\ge X\) 的概率

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>

using namespace std;
typedef long long ll;
const int N = 5555;
const ll mod = 998244353;
int a[N];
int n, m, k;
ll binom[N][N];

ll f_pow(ll a, ll k = mod - 2){
    ll base = 1;
    for(; k; k >>= 1, a = (a * a) % mod){
        if(k & 1)
            base = (base * a) % mod;
    }
    return base;
}

void add(ll &x, ll k){
	x += k;
	if(x > mod)
		x -= mod;
}

int main(){
	for(int i = 0; i < N; i++){
		binom[i][0] = 1;
		for(int j = 1; j <= i; j++)
			binom[i][j] = (binom[i-1][j-1] + binom[i-1][j]) % mod;
	}

	cin >> n >> m >> k;

    for(int i = 1; i <= n; i++){
		cin >> a[i];
	}

	ll ans = 0;

	ll invm = f_pow(m);
	for(int X = 1; X <= m; X++){
		int need = n - k + 1;
		int zeronum = 0;

		for(int j = 1; j <= n; j++){
			if(a[j] >= X)
				need--;
			if(a[j] == 0)
				zeronum++;
		}

		if(need < 0 || need > zeronum){
			add(ans, need < 0 ? 1 : 0);
			continue;
		}

		ll p = (m - X + 1) * invm % mod;
		ll q = ((1 - p) % mod + mod) % mod;
		for(int j = need; j <= zeronum; j++){
			ll k = binom[zeronum][j] * f_pow(p, j) % mod * f_pow(q, zeronum - j) % mod;
			k %= mod;
			add(ans, k);
		}
	}
	printf("%lld\n", ans % mod);
    return 0;
}

标签:int,ll,ge,need,include,ABC295,mod
From: https://www.cnblogs.com/lostintianyi/p/17280774.html

相关文章

  • abc295-G
    题目链接:https://atcoder.jp/contests/abc295/tasks/abc295_g题目意思:给你一颗以1为根的有向树,询问有两种情况:    第一种询问是在u,v中加一条边,保证v是可以到u的。......
  • abc295-E
    题目链接:https://atcoder.jp/contests/abc295/tasks/abc295_e一道数学好题,做完后深受启发。思路:设\(A_k\)处的值为\(x\),则答案为:\(E(x)=\Sigma_1^mi*p(x=i)=1*p(x......
  • 【题解】Atcoder ABC295 A-G
    A.ProbablyEnglish题目分析:直接每一个单词判一下就好了。代码:点击查看代码#include<bits/stdc++.h>usingnamespacestd;intmain(){ intn;scanf("%d",&n); bo......
  • [ABC295Ex] E or m 题解
    状压dp,2hd4me/ng。题意开始你有一个全\(0\)矩阵,你可以随意执行如下操作:选择任意一行,将其从最左端开始的连续一段染成\(1\)。选择任意一列,将其从最上端开始的连......
  • AT_abc295_d 题解
    一、题目描述:给你一个由数字0~9组成的字符串,长度为N(1<=N<=500000)。求出满足1<=l<=r<=N且在l~r区间内所有数字都出现了偶数次的整数对l,r有多少对。......
  • ABC295 D题 题解
    题意简述给定一个长度不超过\(5\times10^5\)的,仅有数字构成的字符串,问存在多少段子串,使得子串内字符重新排序后,前半段与后半段相同?做法分析重组后前后两部分相同,其实也......
  • ABC295 A~C题解
    A-ProbablyEnglish共有\(n\)个单词,如果出现过and,not,that,the,you其中一个单词至少一次,输出\(Yes\),否则,输出\(No\)。(输入的单词均为小写)按题意模拟即可:#include<......