萌新求助
查看原帖
萌新求助
455490
Sharpsmile楼主2025/1/6 09:14

自己胡的一个做法,大概就是先把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;
}
/*
*/
2025/1/6 09:14
加载中...