题目

​ $laofu $出的题

​ \(n\)个离散型随机变量\(X_i\)可能的值为\([1,D]\) ,求有至少\(m\)对的概率

​ $0 \le m \le 10^9 \ , \ 1 \le n \le 10^9 \ , \ 1 \le D \le 10^5 $

题解

  • 60 pts

    观察到能配对的个数只和颜色奇数个数有关

    令\(L=min(D,n-2m)\),这是奇数个数上界

    \(dp_i,j\)表示前\(i\)个球,奇数个数为\(j\)的方案

    复杂度:\(O(Dn)\)

    如果用快速幂转移加上一些奇技淫巧可以通过13-15

  • 100pts

    $ f_i $ 表示硬点$ i $ 个颜色是奇数的方案和

    \[\begin{align}
    f_i &= (^D_i)n![x^n](\frac{e^x-e^{-x}}{2} )^i e^{(D-i)x}\\
    &= \frac{i!(^D_i)}{2^i} \sum_{j=0}^{i} \frac{(-1)^j(D-2j)^n}{j!(i-j)!}
    \end{align}
    \]

    直接把\(f_i\)卷出来,考虑二项式反演

    \[\begin{align}
    g_i &= \sum_{j \ge i}(-1)^{j-i}(^j_i) f_j \\
    即\ i!g_i &= \sum_{j \ge i}\frac{(-1)^{j-i}}{(j-i)!}\times j!f_j\\
    把 G和F都 & \ reverse \ 一下就可以卷积了
    \end{align}
    \]

    #include<bits/stdc++.h>
    #define ll long long
    #define mod 998244353
    using namespace std;
    const int N=400010;
    int D,n,m,G=3,fac[N],inv[N],ny[N],len,L,rev[N],a[N],b[N],c[N],f[N];
    void inc(int&x,int y){x+=y;if(x>=mod)x-=mod;}
    int pw(int x,int y){
    if(y<0)y+=mod-1;
    int re=1;
    while(y){
    if(y&1)re=(ll)re*x%mod;
    y>>=1;x=(ll)x*x%mod;
    }
    return re;
    }
    void ntt(int*A,int F){
    for(int i=0;i<len;++i)if(i<rev[i])swap(A[i],A[rev[i]]);
    for(int i=1;i<len;i<<=1){
    int wn=pw(G,F*(mod-1)/i/2);
    for(int j=0;j<len;j+=(i<<1)){
    int w=1;
    for(int k=0;k<i;++k,w=(ll)w*wn%mod){
    int x=A[j+k],y=(ll)w*A[j+k+i]%mod;
    A[j+k]=(x+y)%mod;A[j+k+i]=(x-y+mod)%mod;
    }
    }
    }
    if(!~F)for(int i=0;i<len;++i)A[i]=(ll)ny[len]*A[i]%mod;
    }
    void Mul(int*A,int*B,int*C){
    ntt(A,1);ntt(B,1);
    for(int i=0;i<len;++i)C[i]=(ll)A[i]*B[i]%mod;
    ntt(C,-1);
    }
    int main(){
    // freopen("pearl.in","r",stdin);
    // freopen("pearl.out","w",stdout);
    scanf("%d%d%d",&D,&n,&m);
    for(L=0,len=1;len<=D<<1;++L,len<<=1);
    ny[1]=1;for(int i=2;i<=len;++i)ny[i]=(ll)(mod-mod/i)*ny[mod%i]%mod;
    for(int i=fac[0]=inv[0]=1;i<=len;++i){
    fac[i]=(ll)fac[i-1]*i%mod;
    inv[i]=(ll)inv[i-1]*ny[i]%mod;
    rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));
    }
    for(int i=0;i<=D;++i){
    f[i]=(ll)fac[D]*inv[D-i]%mod*pw(2,-i)%mod;
    b[i]=(ll)inv[i]*pw((D-2*i+mod)%mod,n)%mod;
    a[i]=inv[i];if(i&1)b[i]=(mod-b[i])%mod;
    }
    Mul(a,b,c);
    for(int i=0;i<=D;++i)f[i]=(ll)f[i]*c[i]%mod;
    for(int i=0;i<len;++i)a[i]=b[i]=c[i]=0;
    for(int i=0;i<=D;++i){
    a[i]=i&1?mod-inv[i]:inv[i];
    b[i]=(ll)fac[D-i]*f[D-i]%mod;
    }
    Mul(a,b,c);
    int ans=0,mn=min(D,n-2*m);
    for(int i=0;i<=mn;++i)inc(ans,(ll)inv[i]*c[D-i]%mod);
    cout<<ans<<endl;
    return 0;
    }
  • 官解

    感觉挺好玩

    谁说生成函数只能有一个未知数的???

    我们重新设计一下不用二项式反演的生成函数

    \[\begin{align}
    ans &= \sum_{i=0}^{L}n!(\frac{e^x+e^{-x}}{2}+y\frac{e^x-e^{-x}}{2})^D[x^ny^i]\\
    &= \frac{n!}{2^D} \sum_{i=0}^{L}(e^x(1+y)+e^{-x}(1-y))^D[x^ny^i]\\
    &= \frac{n!}{2^D} \sum_{i=0}^{L}\sum_{j=0}^{D}(^D_j)e^{(2j-D)x}(1+y)^j(1-y)^{D-j}[x^ny^i]\\
    &= \frac{n!}{2^D} \sum_{j=0}^{D}(^D_j)e^{(2j-D)x}[x^n] \sum_{i=0}^{L}(1+y)^j(1-y)^{D-j}[x^ny^i]\\
    \end{align}
    \]

    考虑求后面\(y\)那坨,就是某个式子的前\(L\)项和,我们知道:

\[(1+y)^i(1-y)^{D-i} = -(1+y)^{i-1}(1-y)^{D-i+1}+2(1+y)^{i-1}(1-y)^{D-i}\\
即F(D,i) = -F(D,i-1) + 2F(D-1,i-1)
\]

​ 只需要求出\(F(I,0)(I \le D)\)即可通过组合数卷出\(F(D,i)\)

  可是由于我上课没有认真听讲,所以我忘了怎么求的\(F(I,0)\)惹.......

  可能有天会突然醒悟吧....

​ upd:看了上课认真听讲的BAJim_H的题解,好吧是我太弱了.....

\[\begin{align}
F(I,0)&= \begin{cases}
0 &(I>L)\\
\sum_{i=0}^{L} (-1)^i (^I_i) &(I<L)
\end{cases}\\
&讨论第二个式子,把组合数拆开\\
&= \sum_{i=0}^{L} (^{I-1}_i)(-1)^i + \sum_{i=0}^{L-1}(^{L-1}_{i})(-1)^{i+1}\\
&= (^{I-1}_L)(-1)^L
\end{align}
\]

​ 这样只要一次卷积.

【loj3120】【CTS2019】珍珠的更多相关文章

  1. LOJ3120 CTS2019 珍珠 生成函数、二项式反演、NTT

    传送门 题目大意:给出一个长度为\(n\)的序列\(a_i\),序列中每一个数可以取\(1\)到\(D\)中的所有数.问共有多少个序列满足:设\(p_i\)表示第\(i\)个数在序列中出现的次数,\( ...

  2. [CTS2019]珍珠——二项式反演

    [CTS2019]珍珠 考虑实际上,统计多少种染色方案,使得出现次数为奇数的颜色数<=n-2*m 其实看起来很像生成函数了 n很大?感觉生成函数会比较整齐,考虑生成函数能否把n放到数值的位置,而 ...

  3. 【题解】CTS2019珍珠(二项式反演+卷积)

    [题解]CTS2019珍珠 题目就是要满足这样一个条件\(c_i\)代表出现次数 \[ \sum {[\dfrac {c_i } 2]} \ge 2m \] 显然\(\sum c_i=n\)所以,而且 ...

  4. 题解-CTS2019 珍珠

    题面 CTS2019 珍珠 有 \(n\) 个在 \([1,d]\) 内的整数,求使可以拿出 \(2m\) 个整数凑成 \(m\) 个相等的整数对的方案数. 数据范围:\(0\le m\le 10^9 ...

  5. [LOJ3120][CTS2019|CTSC2019]珍珠:生成函数+NTT

    分析 容易发现\(D \leq n - 2m\)时,任意数列都满足要求,直接判掉,下文所讨论的均为\(D > n - 2m\)的情况. 考虑把两个数列合并,显然可以认为是两个带标号对象的合并,可 ...

  6. 题解 P5401 [CTS2019]珍珠

    蒟蒻语 这题太玄学了,蒟蒻写篇题解来让之后复习 = = 蒟蒻解 假设第 \(i\) 个颜色有 \(cnt_i\) 个珍珠. \(\sum\limits_{i=1}^{n} \left\lfloor\f ...

  7. [LOJ#3120][Luogu5401][CTS2019]珍珠(容斥+生成函数)

    https://www.luogu.org/blog/user50971/solution-p5401 #include<cstdio> #include<algorithm> ...

  8. Luogu5401 CTS2019珍珠(生成函数+容斥原理+NTT)

    显然相当于求有不超过n-2m种颜色出现奇数次的方案数.由于相当于是对各种颜色选定出现次数后有序排列,可以考虑EGF. 容易构造出EGF(ex-e-x)/2=Σx2k+1/(2k+1)!,即表示该颜色只 ...

  9. [CTS2019]珍珠(NTT+生成函数+组合计数+容斥)

    这题72分做法挺显然的(也是我VP的分): 对于n,D<=5000的数据,可以记录f[i][j]表示到第i次随机有j个数字未匹配的方案,直接O(nD)的DP转移即可. 对于D<=300的数 ...

  10. 洛谷 P5401 - [CTS2019]珍珠(NTT+二项式反演)

    题面传送门 一道多项式的 hot tea 首先考虑将题目的限制翻译成人话,我们记 \(c_i\) 为 \(i\) 的出现次数,那么题目的限制等价于 \(\sum\limits_{i=1}^D\lflo ...

随机推荐

  1. 移动端开发rem布局之less+媒体查询布局的原理步骤和心得

    rem即是以html文件中font-size的大小的倍数rem布局的原理:通过媒体查询设置不同屏幕宽度下的html的font-size大小,然后在css布局时用rem单位取代px,从而实现页面元素大小 ...

  2. MVC学习笔记(三)—用EF向数据库中添加数据

    1.在EFDemo文件夹中添加Controllers文件夹(用的是上一篇MVC学习笔记(二)—用EF创建数据库中的项目) 2.在Controllers文件夹下添加一个空的控制器(StudentsCon ...

  3. js 杂症,this with 变量提升

    一.this.xx 和 xx 是两回事 受后端语言影响,总把this.xx 和xx 当中一回事,认为在function中,xx 就是this.xx,其实完全两回事: this.xx 是沿着this 原 ...

  4. 05、MySQL—字符集

    1.字符编码概念 字符(Character)是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等. 在计算机中所看到的任何内容都是字符构成的. 字符编码(character code)是 ...

  5. 【imx6ul应用开发】如何修改串口?

    4.1如何修改串口?答:开发板已经调好了串口驱动,调试串口,只需要修改dts文件即可,客户可以根据实际需要,确定硬件管脚具体用哪一个. 打开内核源代码/arch/arm/boot/dts/myb-y6 ...

  6. Eclipse - 安装Indent Guide,使JAVA代码具备编辑缩进线,和Delphi一样酷!!

    Delphi里面默认就有代码编辑缩进线,这在编写逻辑复杂的大块代码时候非常有好处,可以清楚地看到每块代码的范围,下面就是Delphi里面代码编辑缩进线的截图: 非常棒的效果,我喜欢,在处理复杂逻辑代码 ...

  7. HttpClient实战三:Spring整合HttpClient连接池

    简介 在微服务架构或者REST API项目中,使用Spring管理Bean是很常见的,在项目中HttpClient使用的一种最常见方式就是:使用Spring容器XML配置方式代替Java编码方式进行H ...

  8. Spring 实例化Bean的3种方式

    要使用Spring中的Bean,需要先创建这个Bean的实例. 实例化Bean有3种方式: 构造器方式 静态工厂方式 实例工厂方式 构造器方式 构造器方式是最常用的.在Bean中写构造函数,然后在配置 ...

  9. js获取任意一天的0点和23:59:59时间

    最近写代码时,需要获取任意一天的起始和结束时间,0点和23:59:59这两个时间的时间戳 使用了setHours() 方法 setHours() 方法用于设置指定的时间的小时字段 1. 获取当天开始时 ...

  10. day 03 作业 预科

    目录 作业 1.简述变量的组成 2.简述变量名的命名规范 3.简述注释的作用 4.使用turtle库构造一幅图,贴在markdown文档中 作业 1.简述变量的组成 变量由变量名.赋值符号.变量值所组 ...