(Ex)Lucas&CRT // Kalthyix
我将进行更多的文字叙述以保证大家的体验
我将更多地直接给出证明和结论而非思考过程
放点组合数学原理吧,至少有用,关键是我只会这个。不打算放很多题。
请注意区分 \(=\) 和 \(\equiv\)。
CRT
没用,请直接学习 ExCRT。
ExCRT
我记得之前有人讲过。相信大家都会,但我为了水字数,所以再写一下。
ExCRT 用来求同余方程组的解。
只有两个方程
我们先考虑求 \(2\) 个同余方程的解:
我们直接蛇:
那么:
我们现在求一组 \(k_1\)、\(k_2\) 的解。
由裴蜀定理,当且仅当 \(\gcd(m_1,m_2)\space| \space (r_2-r_1)\) 时有解。记得要先判有没有解。
裴蜀定理:
若存在 \(x\)、\(y\) 使 \(ax+by=n\) 成立,则 \(\gcd(a,b) \space | \space n\)。
确认有解之后,我们直接继续蛇 \(d = \gcd(m_1,m_2)\),
现在我们把原柿写成:
不难发现 \(\gcd(\frac{m_1}{d},\frac{m_2}{d}) = 1\),于是我们直接扩欧求这个柿子的解。
然后再蛇求出来解为:
直接带回原柿:
于是我们求得了上面两个同余方程的解。
好几个方程
现在求 \(n\) 个同余方程的解。
假设我们求出了前两个方程的解为 \(x\)。
则对于前两个方程,通解为 \(X_i = x+k\cdot lcm(m_1,m_2)\)。
即 \(X_i \equiv x\pmod {lcm(m_1,m_2)}\)
我们发现我们又构造了一个新的同余方程,且这个方程的解满足先前两个方程。
此时两个同余方程被合并为了一个。
然后一直合并下去就行了。
Lucas
这个大家应该都非常会。其实打完 ExCRT 我已经快Ⅳ了,所以我们直接下一个。
ExLucas
求 \(C_n^m \% P\),\(P\) 不为质数。
朴素想法
直接质因数分解 \(P = \prod_{i=1}^{k} p_{i}^{c_i}\),
列出 \(k\) 个方程 \(C_n^m \equiv r_i (\bmod \space p_i^{c_i})\),
然后 ExCRT 合并。
然而
然而,\(C_n^m = \frac{n!}{m!(n-m)!}\),\(m!(n-m)!\) 与 \(p^{c}\) 可能不互质。
在域内求不了逆元那你不炸了......朴素想法还是不美妙啊。
那直接把 \(C_n^m\) 中的所有 \(p\) 分离出来,最后再乘回去不就完事了吗:
使得 \(\gcd(n!,p^{k_1}) = \gcd(m!,p^{k_2}) = \gcd((n-m)!,p^{k_3}) = 1\)。
子问题变为求 \(\frac{n!}{p^k} \% p^c\) 和其中的 \(k\)。
直接拆开阶乘,把 \(p\) 的倍数全提出来:
上面的柿子中,\(p^{\lfloor\frac{n}{p}\rfloor}\) 直接求了;\((\frac{n}{p})!\) 递归求;\(\prod_{i=1,p\nmid i}^{n} i\) 继续分解。
现在我们考虑 \(\prod_{i=1,p\nmid i}^{n} i\) 在 \(\bmod \space p^c\) 下的运算:
此时有一个美妙的性质 \(x \equiv t\cdot m+y \space (\bmod\space m)\):
上面的柿子中 \((\prod_{i=1,p\nmid i}^{p^c}i)^{\lfloor \frac{n}{p^c}\rfloor}\) 和 \((\prod_{i=p^c\cdot\lfloor\frac{n}{p^c}\rfloor+1,p\nmid i}^{n}i)\) 项数实际并不会很多,枚举一下得了。
现在我们已经会求 \(\frac{n!}{p^k} \% p^c\),然后求其中的 \(k\)。
其实我们发现 \(k\) 的贡献来源与 \(n!\) 分解中的 \((\frac{n}{p})!\cdot p^{\lfloor\frac{n}{p}\rfloor}\)。
\((\frac{n}{p})!\) 的贡献递归求;\(p^{\lfloor\frac{n}{p}\rfloor}\) 会贡献 \(\lfloor\frac{n}{p}\rfloor\)。
现在我们会求了 \(\frac{n!}{p^k} \% p^c\) 和其中的 \(k\)。
然后我们就可以求 \(C_n^m \% p^c\) 了!
接下来列出方程组 \(C_n^m \equiv r_i (\bmod \space p_i^{c_i})\),就可以愉快地用 ExCRT 合并了。
接下来是一些需要运用以上的东西的玩意
多重集合
多重集合排列
将 \(n\) 个物品划分为 \(k\) 个集合,集合 \(i\) 大小为 \(c_i\),求总方案数。
我们尝试转换一下问题:
有 \(k\) 种物品,第 \(i\) 种物品有 \(c_i\) 个,用 \(n\) 个物品。求将这些物品排成一排的不同方案数。
若 \(\sum_{i=1}^k c_i >n\),无解。
若 \(sum_{i=1}^k c_1=n\),总方案数为 \(\frac{\sum_{i=1}^k (c_i)!}{\prod_{i=1}^{k}(c_i)!} = \frac{n!}{\prod_{i=1}^{k}(c_i!)}\)。
若 \(sum_{i=1}^k c_i<n\),令 \(c_{k+1} = n-sum_{i=1}^k c_i\) 即可。
但大部分时候我们要在 \(\bmod P\) 意义下进行。
发现这玩意和 \(C_n^m\) 简直一模一样,于是把组合数拆开,然后 ExLucas 即可。
多重集合组合
有 \(n\) 种元素,从中选 \(k\) 个,有几种可行方案。
我们尝试转换一下问题:
有 \(k\) 个元素,分为 \(n\) 堆,允许存在空集。
如果不存在空集,那隔板法答案为 \(C_{k+1}^{n-1}\)。
然而,允许存在空集,即可以存在”空“这种元素,故答案为 \(C_{n+k-1}^{n-1}\)。
如果此时我们再加一个条件,使得划分的集合每个大小不超过 \(c_i\),那么容斥即可。
不难想到在 \(\bmod P\) 意义下,需要 ExLucas。
题 !!!
你别管我扔啥题,反正我就只做过那点题。。。
P2606 [ZJOI2010] 排列计数
\(p_i > p_{\lfloor \frac{i}{2} \rfloor}\) 是个小根堆,题目需要求满足小根堆性质的排列方案数。
把这个问题拎到小根堆上,思考其中一个子树。
它的大小为 \(siz\),左子树内有 \(ls\) 个点,右子树有 \(siz-ls-1\) 个点。
只要保证它的根是最小的,其余左右子树的 \(siz-1\) 个点在左右子树中可以任选。
设 \(dp_u\) 为以 \(u\) 为根的方案数。
那么 \(dp_u = C_{siz-1}^{ls} \times dp_{ls} \times dp_{rs}\)。
Lucas 再求一下 C 就行了。
P2183 [国家集训队] 礼物
孩子,如果你认真阅读了上面的内容,你将发现这就是多重集合排列板题。

浙公网安备 33010602011771号