分析

容易发现\(D \leq n - 2m\)时,任意数列都满足要求,直接判掉,下文所讨论的均为\(D > n - 2m\)的情况。

考虑把两个数列合并,显然可以认为是两个带标号对象的合并,可以使用EGF相乘。

我们可以枚举有\(k\)个数出现了奇数次,答案即为:

\[\begin{aligned}
ans=&n!\sum_{k=0}^{n-2m}(EVEN(x)+yODD(x))^D[x^n][y^k]\\
=&n!\sum_{k=0}^{n-2m}(\frac{e^x+e^{-x}}{2}+y\frac{e^x-e^{-x}}{2})^D[x^n][y^k]\\
=&n!\frac{1}{2^D}\sum_{k=0}^{n-2m}((e^x+e^{-x})+y(e^x-e^{-x}))^D[x^n][y^k]\\
=&n!\frac{1}{2^D}\sum_{k=0}^{n-2m}(e^x(1+y)+e^{-x}(1-y))^D[x^n][y^k]\\
=&n!\frac{1}{2^D}\sum_{k=0}^{n-2m}\sum_{i=0}^{D}\binom{D}{i}e^{(2i-D)x}(1+y)^i(1-y)^{D-i}[x^n][y^k]\\
=&\frac{1}{2^D}\sum_{k=0}^{n-2m}\sum_{i=0}^{D}\binom{D}{i}(2i-D)^n(1+y)^i(1-y)^{D-i}[y^k]\\
=&\frac{1}{2^D}\sum_{i=0}^{D}\binom{D}{i}(2i-D)^n\sum_{k=0}^{n-2m}(1+y)^i(1-y)^{D-i}[y^k]\\
\end{aligned}
\]

(以下部分参考了bestfy的博客。)

现在我们需要对\(\forall i \in [0,D]\),求出\(f(i)=\sum_{k=0}^{n-2m}(1+y)^i(1-y)^{D-i}[y^k]\)。

当\(i < D\)时,

\[\begin{aligned}
f(i)=&\sum_{k=0}^{n-2m}(1+y)^i(1-y)^{D-i}[y^k]\\
=&(1+y)^i(1-y)^{D-i}(1+y+y^2+...)[y^{n-2m}]\\
=&(1+y)^i(1-y)^{D-i-1}[y^{n-2m}]\\
=&\sum_{j=0}^{n-2m}\binom{i}{j}\binom{D-i-1}{n-2m-j}(-1)^{n-2m-j}\\
\end{aligned}
\]

上式可以化成卷积的形式然后NTT。

当\(i = D\)时,

\[f(D)=\sum_{k=0}^{n-2m}(1+y)^D[y^k]
\]

因为\(D>n-2m\),所以这个东西可以直接暴力算。

代码

#include <bits/stdc++.h>

#define rin(i,a,b) for(int i=(a);i<=(b);++i)
#define irin(i,a,b) for(int i=(a);i>=(b);--i)
#define trav(i,a) for(int i=head[a];i;i=e[i].nxt)
#define Size(a) (int)a.size()
#define pb push_back
#define mkpr std::make_pair
#define fi first
#define se second
#define lowbit(a) ((a)&(-(a)))
typedef long long LL; using std::cerr;
using std::endl; inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int MAXN=100005;
const int MOD=998244353;
const int NTT=1048576;
const int G=3;
const int INVG=332748118; int D,N,M,n,m,len,rev[MAXN<<2];
int fac[MAXN],invf[MAXN];
int w[NTT+5],iw[NTT+5];
int A[MAXN<<2],B[MAXN<<2]; inline int qpow(int x,int y){
int ret=1,tt=x%MOD;
while(y){
if(y&1)ret=1ll*ret*tt%MOD;
tt=1ll*tt*tt%MOD;
y>>=1;
}
return ret;
} inline int binom(int n,int m){
if(n<0||m<0||n<m)return 0;
return 1ll*fac[n]*invf[n-m]%MOD*invf[m]%MOD;
} void ntt(int *c,int dft){
rin(i,0,n-1)if(i<rev[i])std::swap(c[i],c[rev[i]]);
for(int mid=1;mid<n;mid<<=1){
int r=(mid<<1),u=NTT/r;
for(int l=0;l<n;l+=r){
int v=0;
for(int i=0;i<mid;++i,v+=u){
int x=c[l+i],y=1ll*c[l+mid+i]*(dft>0?w[v]:iw[v])%MOD;
c[l+i]=x+y<MOD?x+y:x+y-MOD;
c[l+mid+i]=x-y>=0?x-y:x-y+MOD;
}
}
}
if(dft<0){
int invn=qpow(n,MOD-2);
rin(i,0,n-1)c[i]=1ll*c[i]*invn%MOD;
}
} void prepare(){
for(n=1,len=0;n<=m;n<<=1,++len);
rin(i,1,n-1)rev[i]=((rev[i>>1]>>1)|((i&1)<<(len-1)));
} void init(int N){
fac[0]=1;
rin(i,1,N)fac[i]=1ll*fac[i-1]*i%MOD;
invf[N]=qpow(fac[N],MOD-2);
irin(i,N-1,0)invf[i]=1ll*invf[i+1]*(i+1)%MOD;
w[0]=iw[0]=1;
w[1]=qpow(G,(MOD-1)/NTT),iw[1]=qpow(INVG,(MOD-1)/NTT);
rin(i,2,NTT-1){
w[i]=1ll*w[i-1]*w[1]%MOD;
iw[i]=1ll*iw[i-1]*iw[1]%MOD;
}
} int main(){
D=read(),N=read(),M=read();int S=N-2*M;
if(M>N/2){printf("0\n");return 0;}
if(D<=S){printf("%d\n",qpow(D,N));return 0;}
init(D);
rin(i,0,S)A[i]=1ll*(((S-i)&1)?MOD-1:1)*invf[i]%MOD*invf[S-i]%MOD;
rin(i,0,D)if(D-1-S-i>=0)B[i]=1ll*invf[i]*invf[D-1-S-i]%MOD;
m=S+D;prepare();
ntt(A,1);ntt(B,1);
rin(i,0,n-1)A[i]=1ll*A[i]*B[i]%MOD;
ntt(A,-1);
int ans=0;
rin(i,0,D){
if(D-1-i>=0){
A[i]=1ll*A[i]*fac[i]%MOD*fac[D-i-1]%MOD;
ans=(ans+1ll*binom(D,i)*qpow(2*i-D,N)%MOD*A[i])%MOD;
}
else{
int temp=0;
rin(j,0,S)temp=(temp+binom(D,j))%MOD;
ans=(ans+1ll*binom(D,i)*qpow(2*i-D,N)%MOD*temp)%MOD;
}
}
printf("%lld\n",(1ll*ans*qpow(qpow(2,D),MOD-2)%MOD+MOD)%MOD);
return 0;
}

[LOJ3120][CTS2019|CTSC2019]珍珠:生成函数+NTT的更多相关文章

  1. 【CTS2019】珍珠(生成函数)

    [CTS2019]珍珠(生成函数) 题面 LOJ 洛谷 题解 lun题可海星. 首先一个大暴力\(sb\)的\(dp\)是设\(f[i][S]\)表示当前考虑完了前\(i\)个珍珠,\(S\)集合中这 ...

  2. 「CTS2019」珍珠

    「CTS2019」珍珠 解题思路 看了好多博客才会,问题即要求有多少种方案满足数量为奇数的变量数 \(\leq n-2m\).考虑容斥,令 \(F(k)\) 为恰好有 \(n\) 个变量数量为奇数的方 ...

  3. Loj #3124. 「CTS2019 | CTSC2019」氪金手游

    Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...

  4. 「CTS2019 | CTSC2019」氪金手游 解题报告

    「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...

  5. 「CTS2019 | CTSC2019」随机立方体 解题报告

    「CTS2019 | CTSC2019」随机立方体 据说这是签到题,但是我计数学的实在有点差,这里认真说一说. 我们先考虑一些事实 如果我们在位置\((x_0,y_0,z_0)\)钦定了一个极大数\( ...

  6. Solution -「CTS2019」珍珠

    题目   luogu. 题解   先 % 兔.同为兔子为什么小粉兔辣么强qwq. 本文大体跟随小粉兔的题解的思路,并为像我一样多项式超 poor 的读者作了很详细的解释.如果题解界面公式出现问题,可以 ...

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

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

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

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

  9. loj3120 「CTS2019 | CTSC2019」珍珠

    link .... 感觉自己太颓废了....还是来更题解吧...[话说写博客会不会涨 rp 啊 qaq ? 题意: 有 n 个物品,每个都有一个 [1,D] 中随机的颜色,相同颜色的两个物品可以配对. ...

随机推荐

  1. [Luogu5686] 和积和

    Description 给定两个下标从\(1\)到\(n\)编号的序列 \(a_i,b_i\),定义函数\(S(l,r)(1\le l\le r\le n)\)为: \[\sum_{i=l}^r a_ ...

  2. IDEA 修改JavaWeb的访问路径

    问题描述        对于我这个刚刚使用IDEA不久的新手来说,能够正常运行就不错了,不过到了后面,可能会觉得IDEA给你分配的默认访问路径很不顺手,比如访问的时候需要通过: http://loca ...

  3. multivariate_normal 多元正态分布

    多元正态分布 正态分布大家都非常熟悉了,多元正态分布就是多维数据的正态分布,其概率密度函数为 上式为 x 服从 k 元正态分布,x 为 k 维向量:|Σ| 代表协方差矩阵的行列式 二维正态分布概率密度 ...

  4. 解决mac下brew install报错

    Error: Another active Homebrew update process is already in progress.Please wait for it to finish or ...

  5. 多线程的些许理解(平台x86,具体考虑linux,windows)

    多线程的些许理解 一.体系架构 1.原子操作 1) 定义 不可中断的一个或者一系列操作,也就是不会被线程调度机制打断的操作,在运行期间不会有任何的上下文切换(context switch). 2) 我 ...

  6. MySQL面试题(二)

    ● 请你说一说mysql的四种隔离状态 参考回答: Mysql主要包含四种隔离状态: 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) 是 是 是 不可重复读(rea ...

  7. 31C3 CTF web关writeup

    0x00 背景 31c3 CTF 还是很人性化的,比赛结束了之后还可以玩.看题解做出了当时不会做的题目,写了一个writeup. 英文的题解可以看这:https://github.com/ctfs/w ...

  8. 如何避免学习linux必然会遇到的几个问题

    相信在看这篇文章的都是对linux系统所迷的志同道合的人,不管你是刚开始学,还是已经接触过一些linux的知识,下面的问题是你在学习linux所必须遇到的,若是没有的话那我只能说大神我服你了.下面我就 ...

  9. 读《JavaScript面向对象编程指南》(二)

    第五章 原型 在JavaScript中,所有函数都会拥有一个 prototype 的属性,默认初始值为空对象. 可以在相关的原型对象中添加新的方法和属性,甚至可以用自定义对象来完全替换掉原有的原型对象 ...

  10. DNS信息探测

    前面学习一下DNS域名解析原理及过程,今天我们学习下DNS域名信息的探测 本章主要目标是从各个角度搜集测试目标的基本信息,包括搜集信息的途径.各种工具的使用方法,以及简单的示例. 0x00 DNS信息 ...