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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UOJ#449. 【集训队作业2018】喂鸽子 min-max容斥,FFT

發(fā)布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UOJ#449. 【集训队作业2018】喂鸽子 min-max容斥,FFT 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文鏈接www.cnblogs.com/zhouzhendong/p/UOJ449.html

題解

設(shè) f(i) 表示給 i 只鴿子喂食使得至少一只鴿子被喂飽的期望次數(shù),先 min-max容斥 一下。($\frac ni$ 表示期望每 $\frac ni$ 步喂這 i 只鴿子一次)

$$ans = \sum_{i=1}^n (-1)^{i+1}\binom ni \frac ni \cdot f(i)$$

考慮如何求 f(i) 。假設(shè)我們喂飽的是第一只鴿子,那么假設(shè)我們喂了其他鴿子 j 次,那么就可以得到以下式子:

$$f(i) = \sum_{j=0}^{\infty} (j+k) \binom {j+k-1}{k-1} \cdot \left ( g^{i-1} \right ) ^{(j)} (0)\cdot \frac 1{i^{j+k}}$$

(注: $h^{(a)}(x)$ 表示函數(shù) $h(x)$ 的 a 階導(dǎo)數(shù),$h^{(a)}(0)$ 表示指數(shù)生成函數(shù) $h$ 的第 a 項系數(shù))

其中 $\left(g^{i-1}\right)^{(j)}(0)$ 表示給 i-1 只鴿子喂食,每只喂的次數(shù)不超過 k-1 次,總共喂了 j 次的方案數(shù)。由于還有一只要強(qiáng)制喂到 k 次,所以要乘上 $\binom{j+k-1}{k-1}$ ,這種情況下喂了 $j+k$ 次鴿子,所以要乘上 $j+k$。

那么這個 g(x) 是什么東西?

對于一只鴿子,可以喂 $0,1,2,\cdots, k-1$ 次,搞一個指數(shù)生成函數(shù)就好了。

$$ g(x) = \sum_{i=0}^{k-1} \frac{ x^i} {i!}$$

時間復(fù)雜度 $O(n^2k \log (nk))$ 。

好像還有一個 $O(n^2k)$ 的神仙做法,先坑著。

代碼

#pragma GCC optimize("Ofast","inline") #include <bits/stdc++.h> #define clr(x) memset(x,0,sizeof (x)) #define For(i,a,b) for (int i=a;i<=b;i++) #define Fod(i,b,a) for (int i=b;i>=a;i--) #define pb(x) push_back(x) #define mp(x,y) make_pair(x,y) #define fi first #define se second #define _SEED_ ('C'+'L'+'Y'+'A'+'K'+'I'+'O'+'I') #define outval(x) printf(#x" = %d\n",x) #define outvec(x) printf("vec "#x" = ");for (auto _v : x)printf("%d ",_v);puts("") #define outtag(x) puts("----------"#x"----------") #define outarr(a,L,R) printf(#a"[%d...%d] = ",L,R);\For(_v2,L,R)printf("%d ",a[_v2]);puts(""); using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef vector <int> vi; LL read(){LL x=0,f=0;char ch=getchar();while (!isdigit(ch))f|=ch=='-',ch=getchar();while (isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return f?-x:x; } const int N=55,K=1005,S=1<<16,mod=998244353; void Add(int &x,int y){if ((x+=y)>=mod)x-=mod; } void Del(int &x,int y){if ((x-=y)<0)x+=mod; } int del(int x,int y){return x-y<0?x-y+mod:x-y; } int Pow(int x,int y){int ans=1;for (;y;y>>=1,x=(LL)x*x%mod)if (y&1)ans=(LL)ans*x%mod;return ans; } int Fac[S],Inv[S]; void prework(){int n=S-1;for (int i=Fac[0]=1;i<=n;i++)Fac[i]=(LL)Fac[i-1]*i%mod;Inv[n]=Pow(Fac[n],mod-2);Fod(i,n,1)Inv[i-1]=(LL)Inv[i]*i%mod; } int C(int n,int m){if (m<0||m>n)return 0;return (LL)Fac[n]*Inv[m]%mod*Inv[n-m]%mod; } int n,k; int m,d,invm; int f[N]; int R[S],w[S]; int a[S],b[S],c[S]; void FFT(int *a,int n){For(i,0,m-1)if (i<R[i])swap(a[i],a[R[i]]);for (int t=n>>1,d=1;d<n;d<<=1,t>>=1)for (int i=0;i<n;i+=d<<1)for (int j=0;j<d;j++){int tmp=(LL)w[t*j]*a[i+j+d]%mod;a[i+j+d]=del(a[i+j],tmp);Add(a[i+j],tmp);} } int main(){prework();n=read(),k=read();for (m=1,d=0;m<n*k;m<<=1,d++);invm=Pow(m,mod-2);For(i,0,m-1)R[i]=(R[i>>1]>>1)|((i&1)<<(d-1));w[0]=1,w[1]=Pow(3,(mod-1)/m);For(i,2,m-1)w[i]=(LL)w[i-1]*w[1]%mod;clr(a);For(i,0,k-1)a[i]=Inv[i];FFT(a,m);For(i,0,m-1)b[i]=1;For(x,1,n){For(i,0,m-1)c[i]=b[i];reverse(w+1,w+m);FFT(c,m);reverse(w+1,w+m);For(i,0,m-1)c[i]=(LL)c[i]*invm%mod*Fac[i]%mod;f[x]=0;For(i,0,m-1)if (c[i])Add(f[x],(LL)C(i+k-1,k-1)*c[i]%mod*(i+k)%mod*Pow(x,mod-i-k)%mod);For(i,0,m-1)b[i]=(LL)b[i]*a[i]%mod;}int ans=0;For(i,1,n){int tmp=(LL)C(n,i)*n%mod*Pow(i,mod-2)%mod*f[i]%mod;if (i&1)Add(ans,tmp);elseDel(ans,tmp);}cout<<ans<<endl;return 0; }

  

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

總結(jié)

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

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