题面传送门

一道多项式的 hot tea

首先考虑将题目的限制翻译成人话,我们记 \(c_i\) 为 \(i\) 的出现次数,那么题目的限制等价于 \(\sum\limits_{i=1}^D\lfloor\dfrac{c_i}{2}\rfloor\le m\)。不难发现这里涉及下取整,稍微有些棘手,因此考虑将这个下取整去掉,显然 \(\lfloor\dfrac{c_i}{2}\rfloor=\dfrac{c_i-c_i\bmod 2}{2}\),故原式可化为 \(\sum\limits_{i=1}^D\dfrac{c_i-c_i\bmod 2}{2}\le m\),我们将左右两边同乘 \(2\),再稍微变个形可得 \(\sum\limits_{i=1}^Dc_i-\sum\limits_{i=1}^Dc_i\bmod 2\le 2m\),显然 \(\sum\limits_{i=1}^Dc_i=n\),故 \(\sum\limits_{i=1}^Dc_i\bmod 2\le n-2m\),也就是 \(c\) 数组中奇数个数 \(\le n-2m\)

方便起见我们先特判掉 \(n-2m<0\) 和 \(n-2m\ge D\) 的情况,两种情况的答案分别为 \(0\) 和 \(D^n\)。接下来我们着重考虑 \(0\le n-2m\lt D\) 的情况。我们记 \(f_i\) 为 \(c\) 数列中恰好存在 \(i\) 个奇数的方案数,那么答案即为 \(\sum\limits_{i=0}^{n-2m}f_i\),注意到这个“恰好 \(i\) 个”很棘手,因此按照套路设 \(g_i\) 表示钦定 \(i\) 个 \(c_j\) 为奇数,剩余随便排的方案数,求出 \(g_i\) 后即可二项式反演求出 \(f_i\),即 \(f_i=\sum\limits_{j=i}\dbinom{j}{i}(-1)^{j-i}g_j\),把式子稍微转化一下即可得到 \(f_i=\dfrac{1}{i!}\sum\limits_{j}j!g_j\times(-1)^{j-i}\dfrac{1}{(j-i)!}\),这显然是一个差卷积的形式,因此求出 \(g_i\) 之后一遍差卷积即可求出答案了。

接下来我们的任务就是求出 \(g_i\)。首先我们肯定要从 \(D\) 种数中选出 \(i\) 个并钦定它们出现次数为奇数,这样选的方案数为 \(\dbinom{D}{i}\)。其次,注意到求出每个数的出现次数后求原序列的方案数是一个二项加法卷积,因此考虑 EGF,根据生成函数那一套理论,我们钦定出现次数为奇数的 EGF 为 \(\dfrac{e^x-e^{-x}}{2}\),其余没有限制的数的 EGF 为 \(e^x\),故 \(g_i=\dbinom{D}{i}n![x^n](\dfrac{e^x-e^{-x}}{2})^i(e^x)^{D-i}\),我们考虑用二项式定理展开并将其变个形,则可以得到:

\[\begin{aligned}
g_i&=\dbinom{D}{i}n![x^n](\dfrac{e^x-e^{-x}}{2})^i(e^x)^{D-i}\\
&=\dbinom{D}{i}\dfrac{n!}{2^i}[x^n](e^x-e^{-x})^i(e^x)^{D-i}\\
&=\dbinom{D}{i}\dfrac{n!}{2^i}[x^n]\sum\limits_{j=0}^i\dbinom{i}{j}(e^x)^j(-e^{-x})^{i-j}(e^x)^{D-i}\\
&=\dbinom{D}{i}\dfrac{n!}{2^i}[x^n]\sum\limits_{j=0}^i\dbinom{i}{j}(e^x)^j(e^{-x})^{i-j}(e^x)^{D-i}(-1)^{i-j}\\
&=\dbinom{D}{i}\dfrac{n!}{2^i}[x^n]\sum\limits_{j=0}^i\dbinom{i}{j}(e^x)^{D-2(i-j)}(-1)^{i-j}\\
&=\dbinom{D}{i}\dfrac{n!}{2^i}\sum\limits_{j=0}^i\dbinom{i}{j}[x^n](e^x)^{D-2(i-j)}(-1)^{i-j}\\
&=\dbinom{D}{i}\dfrac{n!}{2^i}\sum\limits_{j=0}^i\dbinom{i}{j}\dfrac{1}{n!}(D-2(i-j))^n(-1)^{i-j}\\
&=\dbinom{D}{i}\dfrac{1}{2^i}\sum\limits_{j=0}^i\dfrac{i!}{j!(i-j)!}(D-2(i-j))^n(-1)^{i-j}\\
&=\dbinom{D}{i}\dfrac{1}{2^i}i!\sum\limits_{j=0}^i\dfrac{1}{j!}·\dfrac{(D-2(i-j))^n(-1)^{i-j}}{(i-j)!}
\end{aligned}
\]

推到这一步不难发现这是一个卷积的形式,记 \(a_j=\dfrac{1}{j!},b_j=\dfrac{(D-2j)^n(-1)^{j}}{j!}\),跑遍卷积即可求出 \(g_i\)

时间复杂度 \(D\log D\)。

const int MAXP=1<<18;
const int MOD=998244353;
const int pr=3;
const int ipr=(MOD+1)/3;
const int INV2=MOD+1>>1;
int qpow(int x,int e){
int ret=1;
for(;e;e>>=1,x=1ll*x*x%MOD) if(e&1) ret=1ll*ret*x%MOD;
return ret;
}
int D,n,m,fac[MAXP+5],ifac[MAXP+5];
void init_fac(int n){
for(int i=(fac[0]=ifac[0]=ifac[1]=1)+1;i<=n;i++) ifac[i]=1ll*ifac[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%MOD,ifac[i]=1ll*ifac[i-1]*ifac[i]%MOD;
}
int binom(int n,int k){return 1ll*fac[n]*ifac[k]%MOD*ifac[n-k]%MOD;}
int rev[MAXP+5];
void NTT(vector<int> &a,int len,int type){
int lg=31-__builtin_clz(len);
for(int i=0;i<len;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<lg-1);
for(int i=0;i<len;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);
for(int i=2;i<=len;i<<=1){
int W=qpow((type<0)?ipr:pr,(MOD-1)/i);
for(int j=0;j<len;j+=i){
for(int k=0,w=1;k<(i>>1);k++,w=1ll*w*W%MOD){
int X=a[j+k],Y=1ll*a[(i>>1)+j+k]*w%MOD;
a[j+k]=(X+Y)%MOD;a[(i>>1)+j+k]=(X-Y+MOD)%MOD;
}
}
}
if(type==-1){
int ivn=qpow(len,MOD-2);
for(int i=0;i<len;i++) a[i]=1ll*a[i]*ivn%MOD;
}
}
vector<int> conv(vector<int> a,vector<int> b){
int LEN=1;while(LEN<a.size()+b.size()) LEN<<=1;
a.resize(LEN,0);b.resize(LEN,0);NTT(a,LEN,1);NTT(b,LEN,1);
for(int i=0;i<LEN;i++) a[i]=1ll*a[i]*b[i]%MOD;
NTT(a,LEN,-1);return a;
}
int main(){
scanf("%d%d%d",&D,&n,&m);init_fac(D);
if(n-2*m>=D) return printf("%d\n",qpow(D,n)),0;
if(n-2*m<0) return printf("0\n"),0;
vector<int> a(D+1),b(D+1);
for(int i=0;i<=D;i++){
a[i]=ifac[i];
if(i&1) b[i]=(MOD-1ll*qpow((D-2*i+MOD)%MOD,n)*ifac[i]%MOD)%MOD;
else b[i]=1ll*qpow((D-2*i+MOD)%MOD,n)*ifac[i]%MOD;
}
vector<int> f=conv(a,b),h(D+1);f.resize(D+1);
for(int i=0,pw=1;i<=D;i++,pw=1ll*pw*INV2%MOD)
f[i]=1ll*f[i]*binom(D,i)%MOD*pw%MOD*fac[i]%MOD;
for(int i=0;i<=D;i++) f[i]=1ll*f[i]*fac[i]%MOD;
for(int i=0;i<=D;i++){
if(i&1) h[D-i]=MOD-ifac[i];
else h[D-i]=ifac[i];
} vector<int> g=conv(f,h);int ans=0;
for(int i=0;i<=n-2*m;i++) ans=(ans+1ll*g[D+i]*ifac[i])%MOD;
printf("%d\n",ans);
return 0;
}

洛谷 P5401 - [CTS2019]珍珠(NTT+二项式反演)的更多相关文章

  1. 洛谷 P5400 - [CTS2019]随机立方体(组合数学+二项式反演)

    洛谷题面传送门 二项式反演好题. 首先看到"恰好 \(k\) 个极大值点",我们可以套路地想到二项式反演,具体来说我们记 \(f_i\) 为钦定 \(i\) 个点为极大值点的方案数 ...

  2. LOJ 3120: 洛谷 P5401: 「CTS2019 | CTSC2019」珍珠

    题目传送门:LOJ #3120. 题意简述: 称一个长度为 \(n\),元素取值为 \([1,D]\) 的整数序列是合法的,当且仅当其中能够选出至少 \(m\) 对相同元素(不能重复选出元素). 问合 ...

  3. 洛谷 P5518 - [MtOI2019]幽灵乐团 / 莫比乌斯反演基础练习题(莫比乌斯反演+整除分块)

    洛谷题面传送门 一道究极恶心的毒瘤六合一题,式子推了我满满两面 A4 纸-- 首先我们可以将式子拆成: \[ans=\prod\limits_{i=1}^A\prod\limits_{j=1}^B\p ...

  4. 题解 P5401 [CTS2019]珍珠

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

  5. 洛谷P2257 YY的GCD 莫比乌斯反演

    原题链接 差不多算自己推出来的第一道题QwQ 题目大意 \(T\)组询问,每次问你\(1\leqslant x\leqslant N\),\(1\leqslant y\leqslant M\)中有多少 ...

  6. [洛谷P1390]公约数的和·莫比乌斯反演

    公约数的和 传送门 分析 这道题很显然答案为 \[Ans=\sum_{i=1}^n\sum_{j=i+1}^n (i,j)\] //其中\((i,j)\)意味\(gcd(i,j)\) 这样做起来很烦, ...

  7. 洛谷 - P4449 - 于神之怒加强版 - 莫比乌斯反演

    https://www.luogu.org/problemnew/show/P4449 \(F(n)=\sum\limits_{i=1}^{n}\sum\limits_{i=1}^{m} gcd(i, ...

  8. 洛谷 - SP3871 GCDEX - GCD Extreme - 莫比乌斯反演

    易得 $\sum\limits_{g=1}^{n} g \sum\limits_{k=1}^{n} \mu(k) \lfloor\frac{n}{gk}\rfloor \lfloor\frac{n}{ ...

  9. 洛谷 - P1390 - 公约数的和 - 莫比乌斯反演 - 欧拉函数

    https://www.luogu.org/problemnew/show/P1390 求 $\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m} gcd(i,j) $ ...

随机推荐

  1. 乘风破浪,遇见上一代操作系统Windows 10 - 抢鲜尝试安装新微软商店(Microsoft Store)

    背景 在微软官方文章的<十一项关于微软商店新知>中提到: 新的微软商店现在可在Windows 11上找到,我们很高兴地分享,它将在未来几个月内提供给Windows 10客户!我们将很快分享 ...

  2. 生产环境部署springcloud微服务启动慢的问题排查

    今天带来一个真实案例,虽然不是什么故障,但是希望对大家有所帮助. 一.问题现象: 生产环境部署springcloud应用,服务部署之后,有时候需要10几分钟才能启动成功,在开发测试环境则没有这个问题. ...

  3. Java:检查异常与未检查异常

    一.异常的介绍 Throwable 是 Java 中所有错误和异常的超类.Java 虚拟机仅抛出属于此类(或其子类之一)的实例对象,或者是 throw 语句也可以抛出该对象.同样,catch 子句中的 ...

  4. JS控制文本框禁止输入特殊字符

    JS 控制不能输入特殊字符<input type="text" class="domain" onkeyup="this.value=this. ...

  5. Centos7 升级过内核 boot分区无法挂载修

    参考连接:https://www.cnblogs.com/heqiuyong/p/11186301.html 故障图 挂载系统盘,光盘启动,急救模式, chroot /mnt/sysimage 报错 ...

  6. Get value from agent failed: cannot connect to [[192.168.8.102]:10050]: [113] No route to host

    192.168.8.102主机down掉,开机就可以

  7. 这些年我@yangbodong22011参与的开源

    2020年第一天,水一篇博客,对新年起码的尊重.这里记录下我参与的开源项目情况. Talk is cheap. Show me the code Linus Torvalds Jedis PR:htt ...

  8. RPC 框架 Dubbo 从理解到使用(二)

    本篇文章为系列文章,未读第一集的同学请猛戳这里:RPC 框架 Dubbo 从理解到使用(一) 本篇文章讲解 Dubbo 支持的注册中心.Dubbo 负载均衡策略和 Dubbo 控制台的安装. 注册中心 ...

  9. Navicat for MySQL 批量执行多个 SQL 文件

    文件合并 type *.sql >> aaa.sql 执行sql文件 右键点击数据库

  10. css书写规范 & 页面布局规范 &常用案例经验总结

    CSS 属性书写顺序(重点) 建议遵循以下顺序: 布局定位属性:display / position / float / clear / visibility / overflow(建议 displa ...