题解:CF1188E Problem from Red Panda
includeCPP · · 题解
题意:每次操作所有的颜色
设最终颜色
不难发现最终每个颜色的个数为
注意到上式
因为颜色序列在操作过程中每个元素均不能为负,推个式子:
注意到式子与
不难发现
那么我们先把
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=2e6+5,mod=998244353;
typedef long long ll;
ll fac[N],inv[N];
ll k,a[N],f[N];
ll fpow(ll a,ll b){
ll res=1ll;
while(b>=1ll){
if(b&1ll){
res=(res*a)%mod;
}
a=(a*a)%mod;
b>>=1;
}
return res%mod;
}
void init(int n){
fac[0]=1;
for(int i=1;i<=n;i++){
fac[i]=fac[i-1]*i%mod;
}
inv[n]=fpow(fac[n],mod-2);
for(int i=n;i>=1;i--){
inv[i-1]=inv[i]*i%mod;
}
return ;
}
ll C(int n,int m){
if(n<0||m<0)return 0;
return fac[n]*inv[n-m]%mod*inv[m]%mod;
}
ll calc(ll x,ll y){
return C(x+y-1,x);
}
int main(){
init(2000001);
ll n=0;
cin>>k;
for(int i=1;i<=k;i++){
scanf("%lld",&a[i]);
n+=a[i];
}
sort(a+1,a+k+1);
ll res=0,p=1,ans=0;
for(int i=0;i<=a[k];i++){
while(a[p]<i){
f[a[p]%k]++;
p++;
}
res+=f[(i+k-1)%k];
if(i<res)break;
ans=(ans+(calc(i-res,k)-calc(i-res+p-k-1,k))%mod+mod)%mod;
}
cout<<(ans+mod)%mod;
return 0;
}