分析

容易发现\(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. 纯CSS实现tag彩色标签

    利用纯CSS实现彩色tag标签,效果如下图 代码如下: .items a:nth-child(9n){background-color: #4A4A4A;} .items a:nth-child(9n ...

  2. CF 403D Beautiful Pairs of Numbers

    The sequence of integer pairs (a1, b1), (a2, b2), ..., (ak, bk) is beautiful, if the following state ...

  3. model attribute

    model attribute,字面意思,给model加attribute以配置数据库 主键 public class OrderDetail { [Key] public int OrderDeta ...

  4. Git 一般性操作

    git全局设定 git config --global user.name “码云账号” git config --global user.email “码云注册邮箱” git 定位文件夹cd进入到需 ...

  5. 类的函数成员之属性property

    属性命名采用Pascal命名方式,每个单词的首字母大写.访问方式与访问类的公共字段类似. /// <summary> /// 字段 /// </summary> private ...

  6. 一个页面两个div(一个柱状图或者折线图一个饼图)

    需求是一个页面中两个图,一个饼图一个折线图,接口用的是一个接口,柱状图的图例要隐藏掉,X轴为月份,每月份都有两个数据,也就是图例是两个(进口和出口)的意思饼图需要显示最新月份数据,并且有一个下拉框可以 ...

  7. Vue自定义组件以及组件通信的几种方式

    本帖子来源:小贤笔记 功能 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它 ...

  8. Type Trait 和 Type Utility

    所谓Type trait,提供了一种用来处理type 属性的办法,它是个template,可在编译期根据一个或多个template实参(通常也是type)产出一个type或者value. templa ...

  9. insightface作者提供数据训练解读

    1.下载源码: 开源代码地址:https://github.com/deepinsight/insightface 2.查看作者项目训练要求 (1)训练数据 训练数据使用作者提供并制作好的数据,如下图 ...

  10. SEO黑页以及门页框架和JS跳转实现方法

    在去年大家还在针对第三方博客狂轰乱炸,比如:webs.com.blogspot.com.weebly.com主要是因为本身博客平台的权重,再就是低廉的成本,主需要注册,没有域名和服务器的投入.排名也非 ...