蒟蒻语

这题太玄学了,蒟蒻写篇题解来让之后复习 = =

蒟蒻解

假设第 \(i\) 个颜色有 \(cnt_i\) 个珍珠。

\(\sum\limits_{i=1}^{n} \left\lfloor\frac{cnt_i}{2}\right\rfloor \ge m\)

\(\sum\limits_{i=1}^{n} cnt_i - cnt_i \mod 2 \ge 2m\)

\(n - \sum\limits_{i=1}^{n} cnt_i \mod 2 \ge 2m\)

\(\sum\limits_{i=1}^{n} cnt_i \mod 2 \le n-2m\)

即 \(cnt\) 数组中的奇数个数小于等于 \(n-2m\)。

如果 \(n-2m\ge d\),那么答案显然为 \(d^n\) (没有任何限制了)

如果 \(n-2m\le 0\) 那么答案为 \(0\)。

令 \(g = n - 2 m\)

\(odd_i\) : \(cnt\) 数组中恰好 \(i\) 个奇数的方案数

\(f_i\) : \(cnt\) 数组中钦定 \(i\) 个奇数的方案数

\[ans = \sum\limits_{i=0}^{g} odd_i
\]
\[f_x=\sum\limits_{i=x}^{d} C_i^x odd_i \Leftrightarrow odd_x=\sum\limits_{i=x}^{d} (-1)^{i-x} C_i^x f_i
\]

所以考虑通过算出 f 来算出 odd 数组, 从而求得答案。

\[f_i=n!(C_{D}^{i})(\sum\limits_{i=0} \frac{x^i}{i!})^{D-i}(\sum\limits_{i=0} [i \mod 2 = 1] \frac{x^i}{i!})^i [x^n]
\]
\[f_i=n!(C_{D}^{i})e^{x(D-i)} (\frac{e^{x} - e^{-x}}{2})^{i}[x^n]
\]

二项式展开:

\[f_i=n!(C_{D}^{i})\frac{1}{2^i} \sum\limits_{j=0}^{i} C_i^j e^{x(D-i)} e^{jx} (-e^{-x})^{i-j} [x^n]
\]
\[f_i=n!(C_{D}^{i})\frac{1}{2^i} \sum\limits_{j=0}^{i} (-1)^j C_i^j e^{x(D-i)} e^{(i-j)x} e^{-xj} [x^n]
\]
\[f_i=n!(C_{D}^{i})\frac{1}{2^i} \sum\limits_{j=0}^{i} (-1)^j C_i^j e^{x(D-2j)} [x^n]
\]
\[f_i=n!(C_{D}^{i})\frac{1}{2^i} \sum\limits_{j=0}^{i} (-1)^j C_i^j \frac{(D-2j)^n}{n!}
\]
\[f_i=n!(C_{D}^{i})\frac{1}{2^i} \sum\limits_{j=0}^{i} (-1)^j \frac{i!}{j!(i-j)!} \frac{(D-2j)^n}{n!}
\]
\[f_i=(C_{D}^{i})\frac{1}{2^i} \sum\limits_{j=0}^{i} (-1)^j \frac{i!}{j!(i-j)!} (D-2j)^n
\]
\[P_i=(-1)^i \frac{1}{i!} (D-2i)^n
\]
\[f_i=i!(C_{D}^{i})\frac{1}{2^i} \sum\limits_{j=0}^{i} P_j \frac{1}{(i-j)!}
\]
\[这就是个卷积式了!然后就求出了 f_i
\]
\[odd_x=\sum\limits_{i=x}^{d} (-1)^{i-x} C_i^x f_i
\]
\[odd_x=(-1)^x \sum\limits_{i=x}^{d} (-1)^i \frac{i!}{x!(i-x)!} f_i
\]
\[odd_x=\frac{1}{x!}(-1)^x \sum\limits_{i=x}^{d} (-1)^i \frac{i!}{(i-x)!} f_i
\]
\[G_i =f_i(-1)^ii!
\]
\[odd_x=\frac{1}{x!}(-1)^x \sum\limits_{i=x}^{d} \frac{1}{(i-x)!} G_i
\]
\[odd_x=\frac{1}{x!}(-1)^x \sum\limits_{i=x}^{d} \frac{1}{(i-x)!} G_i
\]
\[odd_x=\frac{1}{x!}(-1)^x \sum\limits_{i=0}^{d-x} \frac{1}{i!} G_{i+x}
\]
\[翻转 odd 和 G
\]
\[odd_{d-x}=\frac{1}{x!}(-1)^x \sum\limits_{i=0}^{d-x} \frac{1}{i!} G_{d-x-i}
\]

然后再卷一卷答案就求出来了!!!

蒟蒻码

#include<bits/stdc++.h>
using namespace std;
#define L(i, j, k) for(int i = (j), i##E = (k); i <= i##E; i++)
#define R(i, j, k) for(int i = (j), i##E = (k); i >= i##E; i--)
#define ll long long
#define db double
#define make_pair mp
#define first x
#define second y
#define pb push_back
#define mod 998244353
#define iG 3
#define invG 332748118
#define sz(x) (int)(x.size())
const int N = 4e5 + 7;
int qpow(int x, int y) {
if(x == 0) return 0;
int res = 1;
for(; y; x = 1ll * x * x % mod, y >>= 1) if(y & 1) res = 1ll * res * x % mod;
return res;
}
int ny(int x) { return qpow(x, mod - 2); }
int pp[N];
void fft(int *f, int len, int flag) {
for(int i = 0; i < len; i++) if(i < pp[i]) swap(f[pp[i]], f[i]);
for(int i = 2; i <= len; i <<= 1) {
int l = (i >> 1);
for(int j = 0; j < len; j += i) {
int ch = qpow(flag == 1 ? iG : invG, (mod - 1) / i), now = 1;
for(int k = j; k < j + l; k++) {
int ta = f[k], tb = 1ll * f[k + l] * now % mod;
f[k] = (ta + tb) % mod;
f[k + l] = (ta - tb + mod) % mod;
now = 1ll * now * ch % mod;
}
}
}
if(flag == -1) {
int invn = ny(len);
for(int i = 0; i < len; i++) f[i] = 1ll * f[i] * invn % mod;
}
}
int n, m, d, g, ans, f[N], P[N], ml;
int jc[N], njc[N];
int C(int x, int y) { return 1ll * jc[x] * njc[y] % mod * njc[x - y] % mod; }
int main() {
scanf("%d%d%d", &d, &n, &m);
if(n - 2 * m < 0) return printf("0\n"), 0;
if(n - 2 * m >= d) return printf("%d\n", qpow(d, n)), 0;
jc[0] = njc[0] = 1;
L(i, 1, d) jc[i] = 1ll * jc[i - 1] * i % mod, njc[i] = ny(jc[i]);
for(ml = 1; ml <= d * 2; ml <<= 1);
L(i, 0, d) P[i] = 1ll * qpow((d - 2 * i + mod) % mod, n) * (i % 2 == 0 ? 1 : mod - 1) % mod * njc[i] % mod, f[i] = njc[i];
for(int i = 0; i < ml; i++) pp[i] = ((pp[i >> 1] >> 1) | ((i & 1) * (ml >> 1)));
fft(P, ml, 1), fft(f, ml, 1);
for(int i = 0; i < ml; i++) f[i] = 1ll * P[i] * f[i] % mod;
fft(f, ml, -1);
for(int i = d + 1; i < ml; i++) f[i] = 0;
int now = 1;
L(i, 0, d) f[i] = 1ll * f[i] * now % mod * jc[d] % mod * njc[d - i] % mod, now = 1ll * now * 499122177 % mod;
L(i, 0, d) f[i] = 1ll * f[i] * (i % 2 == 0 ? 1 : mod - 1) % mod * jc[i] % mod;
reverse(f, f + d + 1);
for(int i = 0; i < ml; i++) P[i] = 0;
L(i, 0, d) P[i] = njc[i];
fft(f, ml, 1), fft(P, ml, 1);
for(int i = 0; i < ml; i++) f[i] = 1ll * f[i] * P[i] % mod;
fft(f, ml, -1);
reverse(f, f + d + 1);
L(i, 0, d) f[i] = 1ll * f[i] * (i % 2 == 0 ? 1 : mod - 1) % mod * njc[i] % mod;
g = n - 2 * m;
L(i, 0, g) (ans += f[i]) %= mod;
printf("%d\n", ans);
return 0;
}

题解 P5401 [CTS2019]珍珠的更多相关文章

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

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

  2. 洛谷 P5401 - [CTS2019]珍珠(NTT+二项式反演)

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

  3. 题解-CTS2019 珍珠

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

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

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

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

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

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

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

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

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

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

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

  9. 没有过的题QAQ

    持续更新...纪念一下我的高分暴力...(好丢人啊qwq) NOI2014 动物园 80pts 用倍增暴力跳nxt数组 #include<iostream> #include<cst ...

随机推荐

  1. UNP——第二章,TCP状态,TIME_WAIT

    状态可以用 netstat 验证 加粗线为 数据交换. 可以看出,TCP在 建立连接和 关闭连接,耗费资源, 因为UDP只需要两次数据通信即可. 但UDP没有可靠传输,和流量控制. 上面协商的MSS为 ...

  2. 源码分析:ReentrantReadWriteLock之读写锁

    简介 ReentrantReadWriteLock 从字面意思可以看出,是和重入.读写有关系的锁,实际上 ReentrantReadWriteLock 确实也是支持可重入的读写锁,并且支持公平和非公平 ...

  3. UI自动化中无头浏览器的应用

    因为某次工作中写了个脚本要来回跑,还要在本机上做很多其他的事情,所以就上网找了个方法,无头浏览器,这样就不会浏览器来回弹出来,执行用例还会很快. 废话不多说,直接放代码: #coding=utf-8 ...

  4. redis-server文件启动cmd一闪而过

    工作上需要在本地装redis,所以就帮别人排查了一个问题,就是redis服务双击了之后不能起来,就是一个黑色的cmd框一闪而过,正常的是这样的: 然而,我当时第一次接触windows上的redis服务 ...

  5. API简介(二)

    API简介(二) API简介(一)一文中,介绍了使用API的目的.设计.发行政策以及公共API的含义,本篇主要介绍API的用法,从库和框架.操作系统.远程API.Web API四个方面展开. 库和框架 ...

  6. tp5 上传视频方法

    控制器调用 /** * 视频上传 */ public function video_add(){ if (request()->isPost()){ $video = $_FILES['vide ...

  7. zabbix 监控文件夹

    安装inotify wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz tar -zx ...

  8. 一文搞懂所有Java集合面试题

    Java集合 刚刚经历过秋招,看了大量的面经,顺便将常见的Java集合常考知识点总结了一下,并根据被问到的频率大致做了一个标注.一颗星表示知识点需要了解,被问到的频率不高,面试时起码能说个差不多.两颗 ...

  9. 地图上显示点在点上标注当前点的id

    HTML: <div class="form-group field-company-state"> <div style="width:1000px; ...

  10. C语言讲义——快速排序

    快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序 它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod) 基本思想: 1.先从数列中取出一个数作 ...