日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

UOJ #449. 【集训队作业2018】喂鸽子

發(fā)布時(shí)間:2023/12/20 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UOJ #449. 【集训队作业2018】喂鸽子 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

UOJ #449. 【集訓(xùn)隊(duì)作業(yè)2018】喂鴿子

小Z是養(yǎng)鴿子的人。一天,小Z給鴿子們喂玉米吃。一共有n只鴿子,小Z每秒會(huì)等概率選擇一只鴿子并給他一粒玉米。一只鴿子飽了當(dāng)且僅當(dāng)它吃了的玉米粒數(shù)量\(≥k\)。 小Z想要你告訴他,期望多少秒之后所有的鴿子都飽了。

假設(shè)答案的最簡(jiǎn)分?jǐn)?shù)形式為\(\frac{a}{b}\),你需要求出\(w\),滿足\(a≡b?w \pmod{998244353}(0≤w<998244353).\)

\(n\leq 50,k\leq 1000\)

Orz

首先可以用\(\min-\max\)反演來(lái)解決:

因?yàn)?span id="ozvdkddzhkzd" class="math inline">\(k\)是固定的,所以每個(gè)集合中至少有一個(gè)鴿子被喂飽的期望只與集合大小有關(guān)。
\[ ans=\sum_{i=1}^n(-1)^{i+1}\binom{n}{i}g_i \]
其中\(g_c\)就是至少喂飽\(c\)只鴿子中的一只的期望步數(shù)。

我們將期望轉(zhuǎn)成概率:
\[ \begin{align} g_c&=\sum_{i\geq 1}i*P(x=i)\\ &=\sum_{i\geq 1}P(x\geq i)\\ \end{align} \]
設(shè)\(f_{c,s}\)表示給\(c\)只鴿子喂食,喂了\(s\)次還沒(méi)有將任意一只鴿子喂飽的概率。

所以:
\[ \begin{align} g_c&=\sum_{i\geq 1}\sum_{s=0}^{i-1}\binom{i-1}{s}f_{c,s}(\frac{n-c}{n})^{i-1-s}\\ &=\sum_{s=0}^{c(k-1)}f_{c,s}\sum_{t\geq 0}\binom{s+t}{s}(\frac{n-c}{n})^t \end{align} \]
我們知道:
\[ (\frac{1}{1-x})^k=\sum_{i\geq 0}\binom{i+k-1}{k-1} x^i \]
所以:
\[ \begin{align} \sum_{t\geq 0}\binom{s+t}{t}(\frac{n-c}{n})^t&=(\frac{1}{1-\frac{n-c}{n}})^{s+1}\\ &=(\frac{n}{c})^{s+1} \end{align} \]
所以
\[ g_c=\sum_{s=0}^{c(k-1)}f_{c,s}(\frac{n}{c})^{s+1} \]
接著考慮求\(f\)數(shù)組。

方法就是新加進(jìn)來(lái)一只鴿子就枚舉給這只鴿子喂了多少次食物。
\[ f_{c,s}=\sum_{i=0}^{\min(s,k-1)}\binom{s}{i}\frac{1}{n^i}f_{c-1,s-i}\\ \frac{f_{c,s}}{s!}= \sum_{i=0}^{\min(s,k-1)} \frac{1}{n^ii!} \frac{ f_{c-1,s-i}}{(s-i!)} \\ \]
于是就可以用\(NTT\)算出\(\frac{f_{c,s}}{s!}\)的值了。

復(fù)雜度\(O(n^2klog(k))\)

還有個(gè)\(O(n^2k)\)的算法就先咕著吧。

代碼:

#include<bits/stdc++.h> #define ll long long #define N 55 #define K 1005using namespace std; inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}const ll mod=998244353;ll ksm(ll t,ll x) {ll ans=1;for(;x;x>>=1,t=t*t%mod)if(x&1) ans=ans*t%mod;return ans; }int n,k,m; int f[N][N*K]; ll fac[N*K],ifac[N*K]; ll C(int n,int m) {return fac[n]*ifac[m]%mod*ifac[n-m]%mod;}void NTT(ll *a,int d,int flag) {static int rev[N*K<<2];static ll G=3;int n=1<<d;for(int i=0;i<n;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<d-1);for(int i=0;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);for(int s=1;s<=d;s++) {int len=1<<s,mid=len>>1;ll w=flag==1?ksm(G,(mod-1)/len):ksm(G,mod-1-(mod-1)/len);for(int i=0;i<n;i+=len) {ll t=1;for(int j=0;j<mid;j++,t=t*w%mod) {ll u=a[i+j],v=a[i+j+mid]*t%mod;a[i+j]=(u+v)%mod;a[i+j+mid]=(u-v+mod)%mod;}}}if(flag==-1) {ll inv=ksm(n,mod-2);for(int i=0;i<n;i++) a[i]=a[i]*inv%mod;} }ll A[N*K<<2]; ll B[N*K<<2]; ll g[N];int main() {n=Get(),k=Get();m=n*k;int d=ceil(log2(m+1));fac[0]=1;for(int i=1;i<=m;i++) fac[i]=fac[i-1]*i%mod;ifac[m]=ksm(fac[m],mod-2);for(int i=m-1;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%mod;ll invn=ksm(n,mod-2);for(int i=0;i<k;i++) {A[i]=ksm(invn,i)*ifac[i]%mod;}NTT(A,d,1);for(int i=0;i<k;i++) f[1][i]=1;for(int i=0;i<k;i++) f[1][i]=ksm(invn,i);for(int i=2;i<=n;i++) {for(int j=0;j<1<<d;j++) B[j]=0;for(int j=0;j<=i*(k-1);j++) B[j]=f[i-1][j]*ifac[j];NTT(B,d,1);for(int j=0;j<1<<d;j++) B[j]=B[j]*A[j]%mod;NTT(B,d,-1);for(int j=0;j<=i*(k-1);j++) f[i][j]=B[j]*fac[j]%mod;}for(int i=1;i<=n;i++) {ll w=ksm(i,mod-2)*n%mod;ll t=w;for(int s=0;s<=i*(k-1);s++) {(g[i]+=f[i][s]*t)%=mod;t=t*w%mod;}}ll ans=0;ll flag=1;for(int c=1;c<=n;c++,flag=flag*(mod-1)%mod) {(ans+=flag*C(n,c)%mod*g[c])%=mod;}cout<<ans;return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/hchhch233/p/10745226.html

總結(jié)

以上是生活随笔為你收集整理的UOJ #449. 【集训队作业2018】喂鸽子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。