abc295-E

题目链接:https://atcoder.jp/contests/abc295/tasks/abc295_e

一道数学好题,做完后深受启发。

思路:设Ak处的值为x,则答案为:E(x)=Σ1mip(x=i)=1p(x=1)+2p(x=2)+....+mp(x=m)=p(x>=1)+p(x>=2)+...+p(x>=m)=Σ1mp(x>=i)

接着枚举i,运用组合数学的知识求解。

代码(c++):
#include<bits/stdc++.h>
using namespace std;
const int N = 2010,mod = 998244353;
int num[N];
long long c[N][N];
long long qmod(long long x,long long y){
	long long ans = 1;
	while(y){
		if (y&1) ans = ans*x%mod;
		y = y>>1;
		x = x*x%mod; 
	}
	return ans;
}
int main(){
	int n,m,k;
	cin>>n>>m>>k;
	c[0][0] = 1;
	for (int i=1;i<=2000;i++){
		c[i][0] = 1;
		for (int j=1;j<=i;j++){
			c[i][j] = (c[i-1][j-1]+c[i-1][j])%mod;
		}
	}
	for (int i=1;i<=n;i++) cin>>num[i];
	long long ans = 0;
	for (int i=1;i<=m;i++){
		int z = 0,mx = 0;
		for (int j=1;j<=n;j++){
			if (!num[j]) z++;
			else if (num[j]>=i) mx++; 
		}
		long long p1 = (m-i+1)*qmod(m,mod-2)%mod;
		long long p2 = (i-1)*qmod(m,mod-2)%mod;
		long long q = 0;
		for (int h=max(0,n-k+1-mx);h<=z;h++){
			q = (q+c[z][h]*qmod(p1,h)%mod*qmod(p2,z-h)%mod)%mod;
		}
		ans = (ans+q)%mod;
	}
	cout<<ans<<'\n';
}
posted @   安潇末痕  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示