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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

#3027. [Ceoi2004]Sweet 生成函数 + 组合数学

發布時間:2023/12/4 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 #3027. [Ceoi2004]Sweet 生成函数 + 组合数学 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

傳送門

文章目錄

  • 題意:
  • 思路:

題意:

思路:

這個題顯然可以容斥來寫,剛學生成函數就來水一下。
對于每一堆iii我們寫出其生成函數Fi(x)=∑k=0mi(1+x+x2+...+xmi)=1?x1+mi1?xF_i(x)=\sum_{k=0}^{m_i}(1+x+x^2+...+x^{m_i})=\frac{1-x^{1+m_i}}{1-x}Fi?(x)=k=0mi??(1+x+x2+...+xmi?)=1?x1?x1+mi??,那么將所有堆的生成函數乘起來即G(x)=∏i=1nFi(x)=∏i=1n1?x1+mi1?x=(1?x)?n?∏i=1n(1?x1+mi)G(x)=\prod_{i=1}^nF_i(x)=\prod_{i=1}^n \frac{1-x^{1+m_i}}{1-x}=(1-x)^{-n}*\prod_{i=1}^n(1-x^{1+m_i})G(x)=i=1n?Fi?(x)=i=1n?1?x1?x1+mi??=(1?x)?n?i=1n?(1?x1+mi?),對于后面的這項,由于nnn很小,所以展開最多只有2n2^n2n項,直接暴力展開即可。
對于前面的,我們用牛頓二項式定理展開(1?x)?n=∑i≥0(n+i?1i)xi(1-x)^{-n}=\sum_{i\ge0}\binom{n+i-1}{i}x^i(1?x)?n=i0?(in+i?1?)xi,可以得到對應的xxx項的系數,所以我們直接枚舉∏i=1n(1?x1+mi)\prod_{i=1}^n(1-x^{1+m_i})i=1n?(1?x1+mi?)展開之后的指數為kkk的系數tkt_ktk?,讓后計算前面的項對答案的貢獻,即tk?∑i=a?kb?k(n?1?ii)t_k*\sum_{i=a-k}^{b-k}\binom{n-1-i}{i}tk??i=a?kb?k?(in?1?i?),考慮將其轉換成一個前綴和的形式,考慮到有∑i=0k(n?1+ii)=(n+kn)\sum_{i=0}^k\binom{n-1+i}{i}=\binom{n+k}{n}i=0k?(in?1+i?)=(nn+k?),所以對上面式子進行化簡ck?((n+b?kb?k)?(n+a?k?1a?k?1))c_k*(\binom{n+b-k}{b-k}-\binom{n+a-k-1}{a-k-1})ck??((b?kn+b?k?)?(a?k?1n+a?k?1?)),其實到這里應該就已經結束了,直接枚舉2k2^k2kckc_kck?讓后直接得到答案即可。但是這個題模數不是個質數,而且組合數很大,所以考慮將其轉換為ck?((n+b?kn)?(n+a?k?1n))c_k*(\binom{n+b-k}{n}-\binom{n+a-k-1}{n})ck??((nn+b?k?)?(nn+a?k?1?)),這樣最多只有nnn項,且分母是n!n!n!,我們將模數乘上n!n!n!,在計算組合數的時候將其模上即可,這樣就可避免組合數過大。
調了半天,代碼很丑。。

//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native") //#pragma GCC optimize(2) #include<cstdio> #include<iostream> #include<string> #include<cstring> #include<map> #include<cmath> #include<cctype> #include<vector> #include<set> #include<queue> #include<algorithm> #include<sstream> #include<ctime> #include<cstdlib> #include<cassert> #define X first #define Y second #define L (u<<1) #define R (u<<1|1) #define pb push_back #define mk make_pair #define Mid ((tr[u].l+tr[u].r)>>1) #define Len(u) (tr[u].r-tr[u].l+1) #define random(a,b) ((a)+rand()%((b)-(a)+1)) #define db puts("---") using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); } //void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); } //void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> PII;const int N=20000010,INF=0x3f3f3f3f; const double eps=1e-6;int n,a,b; LL mod=2004; int p[20]; LL inv[N],fun[N],now;LL C(int a,int b) {if(a<0||b<0||a<b) return 0;LL noww=1;for(int i=a,j=b;j;i--,j--) (noww*=1ll*i%mod)%=mod;return (noww/now)%2004; }int main() { // ios::sync_with_stdio(false); // cin.tie(0);cin>>n>>a>>b;now=1;for(int i=2;i<=n;i++) now*=i; mod*=now;for(int i=1;i<=n;i++) scanf("%d",&p[i]),p[i]++;map<int,int>mp;mp[0]=1;for(int i=1;i<=n;i++) {map<int,int>now=mp;for(auto x:mp) {now[x.X+p[i]]+=x.Y*(-1);}mp=now;}LL ans=0;for(auto x:mp) {int c=x.Y,k=x.X;LL now=(C(n+b-k,n)-C(n+a-k-1,n))%2004;ans+=c*now%2004; ans%=2004; ans+=2004; ans%=2004;}printf("%lld\n",ans);return 0; } /**/

總結

以上是生活随笔為你收集整理的#3027. [Ceoi2004]Sweet 生成函数 + 组合数学的全部內容,希望文章能夠幫你解決所遇到的問題。

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