题解:AT_arc139_d [ARC139D] Priority Queue 2
直接从集合的角度考虑计算总和不好处理。考虑换一个方向,因为元素的值域很小,所以可以从每种数的角度计算。具体来说,我们求出
套路地,把等于转化为大于等于。我们枚举
考虑这种操作方式的性质:如果给出一个集合初始
AC code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mo=998244353;
int n,m,k,x,a[5001],cn;
int an,sc[5001],iv[5001];
void pr(){
for(int i=2;i<=k;i++)
iv[i]=(mo-(mo/i)*iv[mo%i]%mo)%mo;
for(int i=1;i<=k;i++)
sc[i]=sc[i-1]*(k-i+1)%mo*iv[i]%mo;
}
int pw(int a,int b){
int re=1;
while(b){
if(b&1)re=re*a%mo;
a=a*a%mo,b>>=1;
}
return re;
}
signed main(){
ios::sync_with_stdio(0);
cin>>n>>m>>k>>x,iv[1]=sc[0]=1,pr();
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++,cn=0){
for(int j=1;j<=n;j++)cn+=(a[j]>=i);
for(int j=0;j<=k;j++){
int c=max(cn+j-k,min(cn+j,n+1-x));
an=(an+c*pw(i-1,k-j)%mo
*pw(m-i+1,j)%mo*sc[j]%mo)%mo;
}
}
cout<<an;
return 0;
}