自己胡的一个做法,大概就是先把a_i排序,然后枚举最后一个C_i=0的位置,但是不知道为什么寄在 test 54 上了
得到的充要条件和题解貌似是一致的。有没有大神帮忙看看qwq
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int fac[2000300],iv[2000300];
int a[1000300];
const int M=998244353;
inline int C(int n,int m){
if(n<0||m<0||n<m)return 0;
return fac[n]*iv[m]%M*iv[n-m]%M;
}
inline int box(int n,int m){
return C(n+m-1,m-1);
}
inline int qp(int a,int x){
int res=1;
while(x){
if(x&1)res=res*a%M;
a=a*a%M;
x>>=1;
}
return res;
}
inline int inv(int x){return qp(x,M-2);}
int t[2003000];
inline int lb(int x){return x&-x;}
inline void mod(int x){
while(x<=2*m)t[x]++,x+=lb(x);
}
inline int g(int x){
int res=0;
while(x)res+=t[x],x-=lb(x);
return res;
}
inline void ins(int x){
for(int i=x+1;i<=m;i+=n)
mod(i);
}
inline void add(int &x,int y){
if((x+=y)>=M)x-=M;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
// freopen("SS.in","r",stdin);
// freopen("SS.out","w",stdout);
fac[0]=iv[0]=1;
for(int i=1;i<=2e6;i++)
fac[i]=fac[i-1]*i%M,iv[i]=inv(fac[i]);
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i],m+=a[i];
sort(a+1,a+n+1);
int res=0;
for(int i=1;i<=n;i++){
for(int t=n-i;t<=a[i];t++){
int rem=t-g(t)-(n-i);
// cout<<i<<" "<<t<<" "<<rem<<endl;
add(res,box(rem,n-1));
if(t-g(t)<0)break;
}
ins(a[i]);
}
cout<<res<<endl;
return 0;
}
/*
*/