「LOJ3119 CTS2019|CTSC2019 随机立方体」 - 容斥

LOJ3119 CTS2019|CTSC2019 随机立方体

tags:容斥

题意

\(n\times m\times l\) 的立方体,求有 \(k\) 个极大数的概率,极大数是指它比所有和它至少有一维相同的数都大的数

题解

\(f_i\) 表示至少有 \(i\) 个极大的数的概率, \(g_i\) 表示恰好有 \(i\) 个极大的数的概率

易得

\[ f_i=\sum_{j=i}^n\binom jig_j \]

二项式反演一下

\[ g_i=\sum_{j=i}^n(-1)^{j-i}\binom jif_j \]

考虑如何求出 \(f_i\)

显然极大的数的 x, y, z 坐标没有相同的, 不妨设极大点为 \((1,1,1),(2,2,2)\cdots (i,i,i)\), 且 \(a_{1,1,1}<a_{2,2,2}<\cdots<a_{i,i,i}\)

显然 \(a_{i,i,i}\) 大于有任意一维坐标小于等于 \(i\) 的点

\(w_i\) 表示至少有一维 \(\le i\) 的点的个数,这个可以直接预处理

那么满足条件的概率是 \(\Pi_{j=1}^i\frac 1{w_j}\)

然后还要乘上方案数 \(\binom ni\binom mi\binom li(i!)^3\)

于是就能算出 \(f_i\) 从而推出 \(g_i\)

//by xay5421 [email protected]
#include<cstdio>
//#define int long long
//#define debug(...) fprintf(stderr,__VA_ARGS__)
#define debug(...) ((void)0)
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i) 
typedef long long ll;typedef unsigned long long ull;
template<typename T>inline void rd(T&x){int f=0,c;while(c=getchar(),c<48||57<c)f^=!(c^45);x=(c&15);while(c=getchar(),47<c&&c<58)x=x*10+(c&15);if(f)x=-x;}
template<typename T>inline void pt(T x){if(x<0)x=-x,putchar('-');if(x>9)pt(x/10);putchar(x%10+48);}
template<typename T>inline void pt(T x,int c){pt(x),putchar(c);}
template<typename T>inline T max(const T&x,const T&y){return x<y?y:x;}
template<typename T>inline T min(const T&x,const T&y){return x<y?x:y;}
const int N=5000005,P=998244353;
int fpow(int a,int b){int res=1;for(;b;b>>=1,a=1ll*a*a%P)if(b&1)res=1ll*res*a%P;return res;} 
int T,n,m,l,k,ans,fac[N],inv[N],a[N],b[N],ib[N];
int C(int a,int b){
    if(a<0||b<0||a-b<0)return 0;
    return 1ll*fac[a]*inv[b]%P*inv[a-b]%P;
}
signed main(){
    fac[0]=fac[1]=inv[0]=inv[1]=1;
    rep(i,2,N-1)fac[i]=1ll*fac[i-1]*i%P,inv[i]=1ll*(P-P/i)*inv[P%i]%P;
    rep(i,2,N-1)inv[i]=1ll*inv[i-1]*inv[i]%P;
    rd(T);
    while(T--){
        rd(n),rd(m),rd(l),rd(k);int mn=min(n,min(m,l));
        a[0]=0;
        rep(i,1,mn)a[i]=(a[i-1]+1ll*(n-i+1)*(m-i+1)+1ll*(n-i+1)*(l-i+1)+1ll*(m-i+1)*(l-i+1)-(n-i+1)-(m-i+1)-(l-i+1)+1)%P;
        b[0]=1;rep(i,1,mn)b[i]=1ll*b[i-1]*a[i]%P;
        ib[mn]=fpow(b[mn],P-2);
        per(i,mn-1,0)ib[i]=1ll*ib[i+1]*a[i+1]%P;
        ans=0;
        rep(i,k,mn)(ans+=1ll*C(n,i)*C(m,i)%P*C(l,i)%P*fac[i]%P*fac[i]%P*fac[i]%P*ib[i]%P*((i-k)&1?P-1:1)%P*C(i,k)%P)%=P; 
        pt(ans,'\n');
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/xay5421/p/LOJ3119.html