CTS2019 CTSC2019 隨機立方體

2022-05-07 19:03:09 字數 1711 閱讀 5526

loj

首先看到這個恰好\(k\)個可以很輕鬆的想到容斥,這個東西就是乙個二項式反演.

接著我們思考如何求恰好\(i\)個合法的個數?設\(dp_i\)為所求,

\[f_i=\prod_^(n-j)(m-j)(l-j)

\\g_i=n\times m\times l-(n-i)\times (m-i)\times (l-i)

\\h_i=h_\times \frac!}

\\\begin

dp_i&=\binom\times f_i\times h_i\times (n\times m\times l-g_i)!

\\&=(n\times m\times l)!\times f_i\times \prod_^\frac\prod_^i(g_j-1)

\\&=(n\times m\times l)!\times f_i\times \prod_^\frac

\end

\]具體解釋就是\(f_i\)表示恰好\(i\)個的放置方案數,\(g_i\)表示可以放置的位置的數量,\(h_i\)表示極大數中數放置的可能方案數.

這個求的是方案數,把\((n\times m \times l)!\)去掉就是概率了,然後直接對\(dp_i\)二項式反演即可.注意最後那個分數可以線性求逆元求.

#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define rep(a,b,c) for(int a=b;a<=c;a++)

#define re register

#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)

typedef pairpii;

#define mp make_pair

inline int gi()

while(ch>='0' && ch<='9')

return f*sum;

}const int n=5000010,mod=998244353;

int qpow(int a,int b)return ret;}

int n,m,l,k,f[n],g[n],ifac[n],m,dp[n],inv[n],fac[n];

void init()

int c(int n,int m)

int main()

for(int i=0;ifor(int i=1;i<=m;i++)g[i]=(1ll*n*m%mod*l%mod-1ll*(n-i)*(m-i)%mod*(l-i)%mod+mod)%mod;

int now=1;

for(int i=1;i<=m;i++)now=1ll*now*g[i]%mod;now=qpow(now,mod-2);

for(int i=m;i;i--)

for(int i=1;i<=m;i++)dp[i]=1ll*f[i]*g[i]%mod;

int ans=0;

for(int i=k,f=1;i<=m;i++,f=mod-f)

ans=(ans+1ll*f*c(i,k)%mod*dp[i]%mod)%mod;

printf("%d\n",ans);

} return 0;

}

題解 CTS2019 珍珠

cts2019 珍珠 有 n 個在 1,d 內的整數,求使可以拿出 2m 個整數湊成 m 個相等的整數對的方案數。資料範圍 0 le m le 10 9 1 le n le 10 9 1 le d le 10 5 非常巧妙的題,主要要用到二項式反演 指數級生成函式和ntt。做個廣告,這是我讀過最好的...

CTS2019 珍珠 生成函式

先考慮 m 會帶來什麼限制。sum d geq m sum d geq m sum d cnt i sum d geq 2m sum d cnt i 1 leq n 2m 也就是出現次數為奇數的數不超過 n 2m 個。這樣就意味著出現次數為偶數的數不小於 k 個。那就設 f i 表示大力硬點 i 個...

CTS2019 氪金手遊

解題思路 考場上想出了外向樹的做法,居然沒意識到反向邊可以容斥,其實外向樹會做的話這個題差不多就做完了。令 dp u i 表示單獨考慮 u 節點所在子樹,子樹內 sum w i 的合法概率,可以簡單證明子樹外的選取是不影響子樹內的答案的,所以可以這樣表示。證明 我們只考慮子樹內的第乙個選出根節點 u...