题目链接:洛谷


pb大佬说这是sb题感觉好像有点过fan。。。(我还是太弱了)

首先,设$i$这个数在序列中出现$a_i$次,要求$\sum_{i=1}^D[a_i \ mod \ 2]\leq n-2m$

如果要直接计算$\leq n-2m$的数量会非常麻烦,所以考虑设$g_i$表示恰好出现$i$个奇数的方案之和。

这样也还是太麻烦,我们考虑使用反演或容斥通过$\geq i$的数量推算出恰好等于$i$的数量,假设$f_i$表示出现$i$个奇数的方案数。

因为这是数的排列问题,所以考虑使用指数型生成函数。

$$\begin{align*}f_k&=[x^n]n!\binom{D}{k}(\frac{e^x-e^{-x}}{2})^k(e^x)^{D-k} \\&=[x^n]\frac{n!}{2^k}\binom{D}{k}(e^x-e^{-x})^ke^{(D-k)x}\end{align*}$$

前面系数的部分可以不用管它,直接看后面多项式的部分。

$$\begin{align*}&(e^x-e^{-x})^ke^{(D-k)x}[x^n] \\=&\sum_{i=0}^k\binom{k}{i}e^{ix}e^{-(k-i)x}(-1)^{k-i}e^{(D-k)x}[x^n] \\=&\sum_{i=0}^k\binom{k}{i}e^{(2i+D-2k)x}(-1)^{k-i}[x^n] \\=&\sum_{i=0}^k\binom{k}{i}e^{(D-2i)x}(-1)^{k-i}[x^n] \\=&\frac{1}{n!}\sum_{i=0}^k\binom{k}{i}(-1)^i(D-2i)^n\end{align*}$$

$$f_k=\frac{D!}{2^k(D-k)!}\sum_{i=0}^k\frac{(-1)^i(D-2i)^n}{i!}*\frac{1}{(k-i)!}$$

可以通过卷积$O(D\log D)$计算。

计算$g_k$可以使用二项式反演,熟悉二项式反演的同学可以知道,二项式反演其实就是指数型生成函数的应用。
$$f_i=\sum_{j=i}^n\binom{j}{i}g_j\Rightarrow g_i=\frac{1}{i!}\sum_{j=k}^n\frac{(-1)^{j-i}}{(j-i)!}*(f_j*j!)$$

$$ans=\sum_{i=0}^{n-2m}g_i$$

时间复杂度$O(D\log D)$

 #include<bits/stdc++.h>
#define Rint register int
using namespace std;
typedef long long LL;
const int N = , mod = , g = , gi = ;
inline int kasumi(int a, int b){
int res = ;
while(b){
if(b & ) res = (LL) res * a % mod;
a = (LL) a * a % mod;
b >>= ;
}
return res;
}
int fac[N], inv[N], invfac[N], ans;
inline void init(int n){
fac[] = ;
for(Rint i = ;i <= n;i ++) fac[i] = (LL) fac[i - ] * i % mod;
invfac[n] = kasumi(fac[n], mod - );
for(Rint i = n;i;i --){
invfac[i - ] = (LL) i * invfac[i] % mod;
inv[i] = (LL) invfac[i] * fac[i - ] % mod;
}
}
int rev[N];
inline int calrev(int n){
int limit = , L = -;
while(limit <= n){limit <<= ; L ++;}
for(Rint i = ;i < limit;i ++)
rev[i] = (rev[i >> ] >> ) | ((i & ) << L);
return limit;
}
inline void NTT(int *A, int limit, int type){
for(Rint i = ;i < limit;i ++)
if(i < rev[i]) swap(A[i], A[rev[i]]);
for(Rint mid = ;mid < limit;mid <<= ){
int Wn = kasumi(type == ? g : gi, (mod - ) / (mid << ));
for(Rint j = ;j < limit;j += (mid << )){
int w = ;
for(Rint k = ;k < mid;k ++, w = (LL) w * Wn % mod){
int x = A[j + k], y = (LL) w * A[j + k + mid] % mod;
A[j + k] = (x + y) % mod;
A[j + k + mid] = (x - y + mod) % mod;
}
}
}
if(type == -){
int inv = kasumi(limit, mod - );
for(Rint i = ;i < limit;i ++) A[i] = (LL) A[i] * inv % mod;
}
}
int D, n, m, F[N], G[N];
int main(){
scanf("%d%d%d", &D, &n, &m);
if(n < * m){
printf("");
return ;
}
if(D <= n - * m){
printf("%d", kasumi(D, n));
return ;
}
init(D);
for(Rint i = ;i <= D;i ++){
F[i] = (LL) kasumi((D - * i + mod) % mod, n) * invfac[i] % mod;
if(i & ) F[i] = mod - F[i];
G[i] = invfac[i];
}
int limit = calrev(D << );
NTT(F, limit, ); NTT(G, limit, );
for(Rint i = ;i < limit;i ++) F[i] = (LL) F[i] * G[i] % mod;
NTT(F, limit, -);
for(Rint i = ;i < limit;i ++) G[i] = ;
for(Rint i = D + ;i < limit;i ++) F[i] = ;
for(Rint i = ;i <= D;i ++){
F[i] = (LL) F[i] * fac[i] % mod * fac[D] % mod * kasumi(, mod - - i) % mod * invfac[D - i] % mod;
G[D - i] = (i & ) ? (mod - invfac[i]) : invfac[i];
}
NTT(F, limit, ); NTT(G, limit, );
for(Rint i = ;i < limit;i ++) F[i] = (LL) F[i] * G[i] % mod;
NTT(F, limit, -);
for(Rint i = ;i <= n - * m;i ++) ans = (ans + (LL) F[i + D] * invfac[i] % mod) % mod;
printf("%d", ans);
}

Luogu5401

【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. 洛谷 P5401 - [CTS2019]珍珠(NTT+二项式反演)

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

  5. LOJ3119 CTS2019 随机立方体 概率、容斥、二项式反演

    传送门 为了方便我们设\(N\)是\(N,M,L\)中的最小值,某一个位置\((x,y,z)\)所控制的位置为集合\(\{(a,b,c) \mid a = x \text{或} b = y \text ...

  6. [LOJ3119][CTS2019|CTSC2019]随机立方体:组合数学+二项式反演

    分析 感觉这道题的计数方法好厉害.. 一个直观的思路是,把题目转化为求至少有\(k\)个极大的数的概率. 考虑这样一个事实,如果钦定\((1,1,1),(2,2,2),...,(k,k,k)\)是那\ ...

  7. LOJ3119. 「CTS2019 | CTSC2019」随机立方体 二项式反演

    题目传送门 https://loj.ac/problem/3119 现在 BZOJ 的管理员已经不干活了吗,CTS(C)2019 和 NOI2019 的题目到现在还没与传上去. 果然还是 LOJ 好. ...

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

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

  9. Codeforces 923E - Perpetual Subtraction(微积分+生成函数+推式子+二项式反演+NTT)

    Codeforces 题目传送门 & 洛谷题目传送门 神仙题 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 首先考虑最朴素的 \(dp\),设 \(dp_{z,i}\) 表示经 ...

随机推荐

  1. harbor上传镜像

    在harbor服务器 1. 下载测试上传使用的镜像docker pull hello-world2. 打tagdocker tag docker.io/hello-world:latest 172.1 ...

  2. AtCoder练习

    1. 3721 Smuggling Marbles 大意: 给定$n+1$节点树, $0$为根节点, 初始在一些节点放一个石子, 然后按顺序进行如下操作. 若$0$节点有石子, 则移入盒子 所有石子移 ...

  3. Mysql高可用集群环境介绍

    MySQL高可用集群环境搭建 01.MySQL高可用环境方案 02.MySQL主从复制原理 03.MySQL主从复制作用 04.在Linux环境上安装MySQL 05.在MySQL集群环境上配置主从复 ...

  4. (十一)shiro与ssm整合

    所有代码在:here pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="h ...

  5. Abp 添加权限项<一>

    1.下载代码,数据库迁移,npm install 2.添加权限项: public static class PermissionNames { public const string Pages_Te ...

  6. tf 2.0

    tf.function和Autograph使用指南-Part 1 "Keras之父发声:TF 2.0 + Keras 深度学习必知的12件事" Effective TensorFl ...

  7. VBA变量(七)

    变量是一个指定的内存位置,用于保存脚本执行过程中可以更改的值.以下是命名变量的基本规则. 变量名称必须使用一个字母作为第一个字符. 变量名称不能使用空格,句点(.),感叹号(!)或字符@,&, ...

  8. windows开机自动执行bat脚本启动cmd命令窗口并执行命令,最后自动关闭cmd命令窗

    先说bat脚本吧,随便在桌面建一个文本文档,在里面写脚本,内容是,先启动cmd命令窗,并执行一个命令,最后自动关闭cmd窗,如下: ---------------------------------- ...

  9. layui下拉多选formSelects使用方法

    下载formSelects-v4插件(引入formSelects-v4.css和formSelects-v4.js) 下载地址:https://fly.layui.com/extend/formSel ...

  10. 手把手教你如何用java8新特性将List中按指定属性排序,过滤重复数据

    在java中常常会遇到这样一个问题,在实际应用中,总会碰到对List排序并过滤重复的问题,如果List中放的只是简单的String类型过滤so easy,但是实际应用中并不会这么easy,往往List ...