题解:AT_arc139_d [ARC139D] Priority Queue 2
在北京联训期间做的这题,感谢 yhw 老师的帮助。挺困难的题(对我来说),我一个晚上才搞定它,所以尽量写得细致一点,让后人更快看懂。
题意
给定一个大小为
题目分析
这一波操作下来,集合
其实很好理解,相当于你把
答案是这一切的总和,你可以枚举上式的
现在考虑
体会一下这个过程。你发现,如果起始的
最终做法
先计算出最开始的
复杂度
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2001,M=998244353;
int n,m,k,x,ans,a[N],fac[N],inv[N];
int fpow(int x,int y)
{
int ans=1;
while(y)
{
if(y&1) ans=ans*x%M;
x=x*x%M;
y>>=1;
}
return ans;
}
int C(int n,int m)
{
return fac[n]*inv[m]%M*inv[n-m]%M;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m>>k>>x;
for(int i=1;i<=n;i++) cin>>a[i];
fac[0]=fac[1]=inv[0]=inv[1]=1;
for(int i=2;i<=k;i++)
{
fac[i]=fac[i-1]*i%M;
inv[i]=(M-M/i)*inv[M%i]%M;
}
for(int i=2;i<=k;i++) inv[i]=inv[i]*inv[i-1]%M;
for(int i=1;i<=m;i++)
{
int c=0;
for(int j=1;j<=n;j++) if(a[j]>=i) c++;
for(int j=0;j<=k;j++)
{
int nc;
if(c>n-x+1) nc=max(c+j-k,n-x+1);
else nc=min(c+j,n-x+1);
ans=(ans+fpow(m-i+1,j)*fpow(i-1,k-j)%M*C(k,j)%M*nc)%M;
}
}
cout<<ans;
return 0;
}
最后安利一下博客,求各位大神一个赞,qwq~~