Description



Solution

有一个直观的思路是考虑每种颜色个数的奇偶性,奇数个数的颜色不能超过\(n-2m\)

因此若\(n-2m\geq D\)则答案一定是\(D^n\)

否则由于每种颜色其实没有区别,我们考虑一种颜色为奇数和为偶数的指数型生成函数

奇数是\(e^x-e^{-x}\over 2\),偶数是\(e^x+e^{-x}\over 2\)

我们枚举有多少个奇数的颜色

容易得到

\[Ans=n!\sum\limits_{i=0}^{n-2m}{D\choose i}\left({e^x-e^{-x}\over 2}\right)^i\left({e^x+e^{-x}\over 2}\right)^{D-i}[x^n]
\]

我考场上写的是这个式子(和题解的本质相同,不过化起来比较麻烦)

提出一个\(2^{-D}\),把后面的东西二项式展开

\[=2^{-D}n!\sum\limits_{i=0}^{n-2m}{D\choose i}\sum\limits_{p=0}^{i}e^{(2p-i)x}{i\choose p}(-1)^{i-p}\sum\limits_{q=0}^{D-i}e^{(2q+i-D)x}{D-i\choose q}[x^n]
\]

此处我们可以枚举\(T=p+q\),并移到最外层

\[=2^{-D}n!\sum\limits_{T=0}^{D}e^{2T-D}\sum\limits_{i=0}^{n-2m}{D\choose i}\sum\limits_{p+q=T}(-1)^{i-p}{i\choose p}{D-i\choose q}[x^n]
\]

容易知道\(n!e^{px}[x^n]=p^n\)

把q换成T-p

\[=2^{-D}\sum\limits_{T=0}^{D}(2T-D)^n\sum\limits_{i=0}^{n-2m}\sum\limits_{p=0}^{T}(-1)^{i-p}{D\choose i}{i\choose p}{D-i\choose T-p}
\]

考场上的时候我就卡在这里推不动了

实际上那三个组合数可以化开成\({D!\over i!(D-i)!}{i!\over (i-p)!p!}{(D-i)!\over (T-p)!(D-i-T+p)!}\)

分配阶乘,约分,补上一个\((D-T)!T!\over (D-T)!T!\)

可以得到

\[=2^{-D}\sum\limits_{T=0}^{D}(2T-D)^n{D\choose T}\sum\limits_{i=0}^{n-2m}\sum\limits_{p=0}^{T}(-1)^{i-p}{T\choose p}{D-T\choose i-p}
\]

可以发现后面是两个二项式卷积的形式

实际上就是\(\left((1+y)^T(1-y)^{D-T}\right)[y^i]\)

后面的就和题解是一样的了。

题解的推法是这样的

\[Ans=n!\sum\limits_{i=0}^{n-2m}\left(y{e^x-e^{-x}\over 2}+{e^x+e^{-x}\over 2}\right)^D[x^n][y^i]
\]

把\(e^x\)和\(e^{-x}\)分开

\[Ans=2^{-D}n!\sum\limits_{i=0}^{n-2m}\left(e^x(1+y)+e^{-x}(1-y)\right)^D[x^n][y^i]
\]

二项式展开

\[Ans=2^{-D}n!\sum\limits_{i=0}^{n-2m}\sum\limits_{T=0}^{D}e^{(2T-D)x}(1+y)^T(1-y)^{D-T}{D\choose T}[x^n][y^i]
\]

把\(i\)放到后面去,就是

\[=2^{-D}\sum\limits_{T=0}^{D}(2T-D)^n{D\choose T}\sum\limits_{i=0}^{n-2m}\left((1+y)^T(1-y)^{D-T}\right)[y^i]
\]

(看来是我的推法太蠢了)

记后面的东西\(F(T,D)=\sum\limits_{i=0}^{n-2m}\left((1+y)^T(1-y)^{D-T}\right)[y^i]\)

接下来就是高端操作时间

把一个\((1+y)\)拆成\(-(1-y)+2\),式子就可以化开成两边,具体略去

立刻可以得到\(F(T,D)=-F(T-1,D)+2F(T-1,D-1)\)

然后\(F(0,D)=\sum\limits_{i=0}^{n-2m}{D\choose i}(-1)^i\)

通过杨辉三角的性质,化到上一行去发现都消掉了,结果就是\({D-1\choose n-2m}(-1)^{n-2m}\)

然后就可以通过NTT加速递推过程求出\(F(T,D)\)了。

实际上网上似乎有一种很简单的推法,利用容斥,变成至少i个为奇数,然后式子就好化很多,结果就是两次直接的卷积,就不需要后面的高端操作了。

时间复杂度\(O(n\log n)\)

Code

#include <bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fod(i,a,b) for(int i=a;i>=b;--i)
#define N 100005
#define M 262144
#define T 18
#define mo 998244353
#define LL long long
using namespace std;
LL l,n,m,js[M+1],ns[M+1],ny[M+1];
LL ksm(LL k,LL n)
{
k=(k+mo)%mo;
LL s=1;
for(;n;n>>=1,k=k*k%mo) if(n&1) s=s*k%mo;
return s;
}
LL C(int n,int m)
{
if(n<m||n<0||m<0) return 0;
return js[n]*ns[m]%mo*ns[n-m]%mo;
}
int a[M+1],b[M+1];
LL F(int w)
{
if(w==0) return 1;
return ((n-2*m)&1)?(mo-C(w-1,n-2*m))%mo:C(w-1,n-2*m);
} int bit[M+1];
int wi[M+1];
namespace polynomial
{
void prp()
{
LL v=ksm(3,(mo-1)/M);
wi[0]=1;
fo(i,1,M)
{
wi[i]=(LL)wi[i-1]*v%mo;
bit[i]=(bit[i>>1]>>1)|((i&1)<<(T-1));
}
}
int inc(int a,int b)
{
return (a+=b)>=mo?a-mo:a;
}
int dec(int a,int b)
{
return (a-=b)<0?a+mo:a;
}
void DFT(int *a)
{
fo(i,0,M-1) if(bit[i]<i) swap(a[i],a[bit[i]]);
for(int h=1,l=(M>>1),v;h<M;h<<=1,l>>=1)
{
for(int j=0;j<M;j+=h<<1)
{
int *x=a+j,*y=x+h,*w=wi;
for(int i=0;i<h;++i,++x,++y,w+=l)
{
v=((LL)*y * *w)%mo;
*y=dec(*x,v);
*x=inc(*x,v);
}
}
}
}
void IDFT(int *a)
{
DFT(a);
fo(i,0,M-1) a[i]=a[i]*ny[M]%mo;
reverse(a+1,a+M);
}
}
using polynomial::prp;
using polynomial::DFT;
using polynomial::IDFT;
int main()
{
cin>>l>>n>>m;
if(n-2*m>=l)
{
printf("%lld\n",ksm(l,n));
return 0;
}
js[0]=js[1]=ny[1]=ns[0]=ns[1]=1;
fo(i,2,M)
{
js[i]=js[i-1]*(LL)i%mo;
ny[i]=(-ny[mo%i]*(LL)(mo/i)%mo+mo)%mo;
ns[i]=ns[i-1]*ny[i]%mo;
}
LL v=1;
fo(i,0,l)
{
a[i]=v*ns[i]%mo*F(l-i)%mo,b[i]=(LL)((i&1)?mo-1:1)*ns[i]%mo;
v=v*(LL)2%mo;
}
prp();
DFT(a),DFT(b);
fo(i,0,M-1) a[i]=(LL)a[i]*(LL)b[i]%mo;
IDFT(a);
LL ans=0;
fo(i,0,l) ans=(ans+a[i]*js[i]%mo*ksm(2*i-l,n)%mo*C(l,i))%mo;
printf("%lld\n",ans*ksm(ksm(2,l),mo-2)%mo);
}

[LibreOJ 3120]【CTS2019】珍珠 【生成函数】【计数】的更多相关文章

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

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

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

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

  3. 题解-CTS2019 珍珠

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

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

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

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

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

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

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

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

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

  8. hdu 4609 3-idiots [fft 生成函数 计数]

    hdu 4609 3-idiots 题意: 给出\(A_i\),问随机选择一个三元子集,选择的数字构成三角形的三边长的概率. 一开始一直想直接做.... 先生成函数求选两个的方案(注意要减去两次选择同 ...

  9. 题解 P5401 [CTS2019]珍珠

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

随机推荐

  1. [Vuejs] Vue解决代理设置导致浏览器Session丢失的问题

    以下是会造成Session丢失的代理: proxyTable: { '/proxyApi': { target: 'http://111.18.149.215:8080/WRSOCXSystem/ht ...

  2. mysql修改max_allowed_packet数据包最大值

    在windows环境下!!!! 1.找到my.inc文件,不是你的安装目录路径,是C:\ProgramData\MySQL\MySQL Server 5.7这个路径,注意 ProgramData 文件 ...

  3. 【6.24校内test】T2 不老梦

    [题目背景] 于万人中万幸得以相逢,刹那间澈净明通. 成为我所向披靡的勇气和惶恐,裂山海,堕苍穹. 爱若执炬迎风,炽烈而哀恸,诸般滋味皆在其中. 韶华宛转吟诵,苍凉的光荣,急景凋年深情难共. ——银临 ...

  4. C语言 --- 高级指针

    1. 指针赋值: C语言允许使用赋值运算进行指针的赋值,前提是两个指针具有相同的类型.                 int i,*p,*q;                 p = &i; ...

  5. Spring Boot解决无法访问图片的问题

    找了很多Spring Boot项目访问图片的解决方式,发现都是配置的,有时配置了也没有用.然后自己研究了一种简单操作的方法. 1,在Spring Boot的static目录下创建一个新目录img(或者 ...

  6. zabbix 监控redis python3脚本

    一:安装redis-python模块 wge  thttps://pypi.python.org/packages/source/r/redis/redis-2.9.1.tar.gz tar xf r ...

  7. Java编程思想读书笔记 第十章 内部类

    非静态内部类作用: 最基本的作用:名字隐藏和组织代码 用例:内部类不访问外部类的元素时可以直接new.(bad style!) 用例:通过外部类的非静态方法返回内部类的引用,这样隐含了内部类对象和其对 ...

  8. centos 6.x 编译安装 pgsql 9.6

    文章结构如下: 一. 环境配置 1. 配置防火墙 查看IPTABLES 当前状态与关闭过程 chkconfig --list|grep iptables 关闭iptables service ipta ...

  9. RabbitMQ入门教程(六):路由选择Routing

    原文:RabbitMQ入门教程(六):路由选择Routing 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog. ...

  10. luogu P5371 [SNOI2019]纸牌

    传送门 打麻将+1(雾 有顺子这种东西...注意到以某个位置为开头的顺子数量最多为2,那么有个想法就是枚举以每个位置为开头的顺子个数,然后每个位置的刻子的取法个数为\(\lceil\frac{\tex ...