专栏文章

ARC139D Priority Queue 2 题解

AT_arc139_d题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minrqn0k
此快照首次捕获于
2025/12/02 07:16
3 个月前
此快照最后确认于
2025/12/02 07:16
3 个月前
查看原文
首先把总和拆开,将 i=1nai\sum\limits_{i=1}^n a_i 转化为 j=1mi=1n[aij]\sum\limits_{j=1}^m \sum\limits_{i=1}^n [a_i \ge j]
于是考虑枚举 jj,计算 i=1n[aij]\sum\limits_{i=1}^n [a_i \ge j] 的总和。
设初始时满足 aija_i \ge jii 的个数等于 cc,操作过程中一共加了 pp 个大于等于 jj 的数:
  • cnx+1c \ge n-x+1,则最终满足 aija_i \ge jii 的个数等于 f(c,p)=max(nx+1,c+pk)f(c,p)=\max(n-x+1,c+p-k)
  • c<nx+1c \lt n-x+1,则最终满足 aija_i \ge jii 的个数等于 f(c,p)=min(nx+1,c+p)f(c,p)=\min(n-x+1,c+p)
于是可以得到:
i=1n[aij]=p=0kf(c,p)(mj+1)p(j1)kp(kp)\sum_{i=1}^n[a_i\ge j]=\sum_{p=0}^k f(c,p)(m-j+1)^p(j-1)^{k-p}{k \choose p}
预处理后直接计算即可。时间复杂度 O(n+mk)\mathcal O(n+mk)
C
#define int long long
const int N=2005,mod=998244353;
int n,m,k,x,a[N],pw[N][N],fac[N],infac[N],ans;
int ksm(int a,int b){
	int res=1;
	while(b){
		if(b&1) res=res*a%mod;
		b>>=1,a=a*a%mod;
	}
	return res;
}
int f(int c,int p){
	if(c>=n-x+1) return max(n-x+1,c+p-k);
	else return min(n-x+1,c+p);
}
int C(int n,int m){
	return fac[n]*infac[m]%mod*infac[n-m]%mod;
}
void solve(){
	cin>>n>>m>>k>>x;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=0;i<=m;i++){
		pw[i][0]=1;
		for(int j=1;j<=k;j++) pw[i][j]=pw[i][j-1]*i%mod;
	}
	fac[0]=infac[0]=1;
	for(int i=1;i<=k;i++) fac[i]=fac[i-1]*i%mod;
	infac[k]=ksm(fac[k],mod-2);
	for(int i=k-1;i>0;i--) infac[i]=infac[i+1]*(i+1)%mod;
	for(int j=1;j<=m;j++){
		int c=0;
		for(int i=1;i<=n;i++) if(a[i]>=j) c++;
		for(int p=0;p<=k;p++) ans+=f(c,p)*pw[m-j+1][p]%mod*pw[j-1][k-p]%mod*C(k,p),ans%=mod;
	}
	cout<<ans<<endl;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...