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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【LUOGU???】WD与积木 NTT

發布時間:2023/12/2 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LUOGU???】WD与积木 NTT 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目大意

  把 \(n\) 個有標號物品分到一些有標號的箱子中且不允許為空,問期望箱子的數量。

  多組詢問。

  \(n\leq 100000\)

題解

  記 \(f_i\)\(i\) 個有標號物品分到一些有標號的箱子中且不允許為空的箱子的數量之和。

  記 \(g_i\)\(i\) 個有標號物品分到一些有標號的箱子中且不允許為空的方案數。

  答案為 \(\frac{f_n}{g_n}\)

  轉移就是枚舉最后一個箱子放了多少物品:
\[ \begin{align} g_i&=\sum_{j=1}^ig_{i-j}\binom{i}{j}\\ f_i&=\sum_{j=1}^i(f_{i-j}+g_{i-j})\binom{i}{j}\\ \end{align} \]

  記 \(F(x)=\sum_{i\geq 0}f_i\frac{x^i}{i!},G(x)=\sum_{i\geq 0}g_i\frac{x^i}{i!}\),(即這兩個數列的EGF)有:
\[ \begin{align} G(x)&=-G(x)+e^xG(x)+1\\ 2G(x)-e^xG(x)&=1\\ G(x)&=\frac{1}{2-e^x}\\ F(x)&=-F(x)-G(x)+e^x(F(x)+G(x))+1\\ (2-e^x)F(x)+(1-e^x)G(x)&=1\\ F(x)&=\frac{(e^x-1)G(x)}{2-e^x}\\ &=\frac{e^x-1}{(2-e^x)^2} \end{align} \]

  直接卷積+求逆即可。

  時間復雜度:\(O(n\log n)\)

代碼

#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<ctime> #include<functional> #include<cmath> #include<vector> #include<assert.h> //using namespace std; using std::min; using std::max; using std::swap; using std::sort; using std::reverse; using std::random_shuffle; using std::lower_bound; using std::upper_bound; using std::unique; using std::vector; typedef long long ll; typedef unsigned long long ull; typedef double db; typedef std::pair<int,int> pii; typedef std::pair<ll,ll> pll; void open(const char *s){ #ifndef ONLINE_JUDGEchar str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout); #endif } void open2(const char *s){ #ifdef DEBUGchar str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout); #endif } int rd(){int s=0,c,b=0;while(((c=getchar())<'0'||c>'9')&&c!='-');if(c=='-'){c=getchar();b=1;}do{s=s*10+c-'0';}while((c=getchar())>='0'&&c<='9');return b?-s:s;} void put(int x){if(!x){putchar('0');return;}static int c[20];int t=0;while(x){c[++t]=x%10;x/=10;}while(t)putchar(c[t--]+'0');} int upmin(int &a,int b){if(b<a){a=b;return 1;}return 0;} int upmax(int &a,int b){if(b>a){a=b;return 1;}return 0;} const ll p=998244353; const int N=270000; ll fp(ll a,ll b) {ll s=1;for(;b;b>>=1,a=a*a%p)if(b&1)s=s*a%p;return s; } namespace ntt {const int W=262144;int rev[N];int *w[20];void init(){ll s=fp(3,(p-1)/W);w[18]=new int[1<<17];w[18][0]=1;for(int i=1;i<W/2;i++)w[18][i]=w[18][i-1]*s%p;for(int i=17;i>=1;i--){w[i]=new int[1<<(i-1)];for(int j=0;j<1<<(i-1);j++)w[i][j]=w[i+1][j<<1];}}void ntt(ll *a,int n,int t){for(int i=1;i<n;i++){rev[i]=(rev[i>>1]>>1)|(i&1?n>>1:0);if(rev[i]>i)swap(a[i],a[rev[i]]);}for(int i=2,l=1;i<=n;i<<=1,l++)for(int j=0;j<n;j+=i)for(int k=0;k<i/2;k++){ll u=a[j+k];ll v=a[j+k+i/2]*w[l][k];a[j+k]=(u+v)%p;a[j+k+i/2]=(u-v)%p;}if(t==-1){reverse(a+1,a+n);ll inv=fp(n,p-2);for(int i=0;i<n;i++)a[i]=a[i]*inv%p;}}void add(ll *a,ll *b,ll *c,int n,int m,int l){static ll a1[N];int k=max(n,m);for(int i=0;i<=k;i++)a1[i]=0;for(int i=0;i<=n;i++)a1[i]=(a1[i]+a[i])%p;for(int i=0;i<=m;i++)a1[i]=(a1[i]+b[i])%p;for(int i=0;i<=l;i++)c[i]=a1[i];}void mul(ll *a,ll *b,ll *c,int n,int m,int l){static ll a1[N],a2[N];int k=1;while(k<=n+m)k<<=1;for(int i=0;i<k;i++)a1[i]=a2[i]=0;for(int i=0;i<=n;i++)a1[i]=a[i];for(int i=0;i<=m;i++)a2[i]=b[i];ntt(a1,k,1);ntt(a2,k,1);for(int i=0;i<k;i++)a1[i]=a1[i]*a2[i]%p;ntt(a1,k,-1);for(int i=0;i<=l;i++)c[i]=(a1[i]+p)%p;}void getinv(ll *a,ll *b,int n){if(n==1){b[0]=fp(a[0],p-2);return;}getinv(a,b,n>>1);static ll a1[N],a2[N];for(int i=0;i<n<<1;i++)a1[i]=a2[i]=0;for(int i=0;i<n;i++)a1[i]=a[i];for(int i=0;i<n>>1;i++)a2[i]=b[i];ntt(a1,n<<1,1);ntt(a2,n<<1,1);for(int i=0;i<n<<1;i++)a1[i]=a2[i]*(2-a1[i]*a2[i]%p)%p;ntt(a1,n<<1,-1);for(int i=0;i<n;i++)b[i]=(a1[i]+p)%p;} } int n=100000; int k=131072; ll inv[N],fac[N],ifac[N]; ll a[N],b[N],f[N],g[N],ans[N],c[N]; int main() {open("d");ntt::init();inv[1]=fac[0]=fac[1]=ifac[0]=ifac[1]=1;for(int i=2;i<=n;i++){inv[i]=(-p/i*inv[p%i]%p+p)%p;fac[i]=fac[i-1]*i%p;ifac[i]=ifac[i-1]*inv[i]%p;}for(int i=1;i<=n;i++){a[i]=ifac[i];b[i]=-ifac[i]; // a[i]=1; // b[i]=-1;}a[0]=0;b[0]=1;ntt::getinv(b,g,k);ntt::mul(g,g,c,n,n,n);ntt::mul(a,c,f,n,n,n);for(int i=1;i<=n;i++){f[i]=(f[i]*fac[i]%p+p)%p;g[i]=(g[i]*fac[i]%p+p)%p;}for(int i=1;i<=n;i++)ans[i]=(f[i]*fp(g[i],p-2)%p+p)%p;int t;scanf("%d",&t);int x;while(t--){scanf("%d",&x);printf("%lld\n",ans[x]);}return 0; }

轉載于:https://www.cnblogs.com/ywwyww/p/10200501.html

總結

以上是生活随笔為你收集整理的【LUOGU???】WD与积木 NTT的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲激情在线 | 午夜小视频免费 | 成人aaa视频 | 视频在线观看免费 | 香蕉久久一区二区三区 | 亚洲欧洲国产日韩 | 亚洲精品高清无码视频 | 亚洲 精品 综合 精品 自拍 | 欧美一级特黄aaaaaa大片在线观看 | 亚洲国产一区二区三区 | 久久这里只有精品99 | 亚洲成人av一区 | 欧美日韩国产在线观看 | 久久久久三级 | 一区二区日韩视频 | 天天久久综合网 | 日日干日日爽 | 欧美精品乱码久久久久久按摩 | 成人女同av免费观看 | 亚洲性免费 | 噜啪啪| a级片黄色 | 亚洲国产综合一区 | 神马午夜视频 | 亚洲免费看av | 少妇理论片 | 黄色一级大片免费版 | 国产中文字幕一区二区三区 | 97精品国产97久久久久久粉红 | 一区二区在线视频播放 | 久久精品久久精品久久 | 中文字幕第页 | 免费观看日本 | 欧美激情一二三区 | 污导航在线 | 欧美日韩一卡 | 欧美日韩亚洲在线观看 | 欧美xxx在线观看 | 99色这里只有精品 | 国产女人高潮视频 | 久久伊人免费视频 | 天天操天天做 | 中文字幕精品三级久久久 | 白嫩白嫩国产精品 | 国产精品剧情一区 | av官网在线观看 | 美女扒开下面让男人捅 | 国产精品理论在线观看 | 成人污视频 | 人妻体内射精一区二区三区 | 啪啪免费网址 | 国产精品久久在线 | 一级片成人 | 91精品视频免费观看 | 成人h视频在线观看 | 国产又猛又黄 | 免费啊v在线观看 | 日韩精品在线观看一区二区 | 久久精品亚洲精品 | 欧美性猛交xxxx乱 | 1000部做爰免费视频 | 91亚洲一区 | 一区二区三区四区人妻 | 爱av在线| 欧美wwwwww| 精品国产欧美一区二区三区成人 | 国产盗摄av| 国产午夜福利100集发布 | 男裸体无遮挡网站 | 国产天堂av在线 | 在线观看福利网站 | 性欧美jzjz2 九草影院 | 国产精品久久久久久亚洲 | 四虎影视永久地址 | 中国亚洲老头同性gay男男… | 国产在线视频一区 | 国产午夜福利片 | 91黄色在线观看 | 国产日韩欧美精品在线观看 | 精品一区二区三区不卡 | 日韩欧美性视频 | 日本精品免费视频 | 成人久久一区 | 日韩欧美国产亚洲 | 黑人多p混交群体交乱 | 亚洲午夜国产 | 国产精品手机在线观看 | 日韩人妻精品一区二区 | 一个人免费在线观看视频 | 欧美偷拍精品 | 国产成人精品一区二区无码呦 | 在线免费观看国产视频 | 亚洲精品福利在线观看 | 亚洲一区精品视频 | 欧美激情一级精品国产 | 欧美三级手机在线观看 | 毛片a| 西西午夜| 操日本女人 |