本文转自:http://blog.csdn.net/skywalkert/article/details/52553048
0. 写在前面
在程序设计中,可能会碰到多种类型的计数问题,其中不少涉及到组合数的计算,所以笔者写下这么一篇文章,期望能解决一些常规的组合数求模问题。以下部分内容改编自AekdyCoin的《组合数求模》,而且为了感谢他对(懵懂的)笔者的启发,这篇文章的标题与其文章相同。另外,感谢Picks将多项式运算的技巧在中国进行推广,感谢51nod提供了许多有趣的数论题目,感谢fotile96开源了他的FFT模板。
在接下来的内容中,文章将围绕m个人跪sd0061的方案数。
author: skywalkert
original article: http://blog.csdn.net/skywalkert/article/details/52553048
last update time : 2017-01-01
1. 枚举法
这一部分的内容主要是利用基本定义
来进行分析的。
1.1 直接枚举
如果2的情况。
若p可以不是质数。
如果需要求),这是因为
如果能提前),这是因为
注意,当m是质数的条件。
1.2 预处理
由于
,所以能够)。
注意到上述式子只涉及加法,所以不需要考虑是否有逆元的问题。
这种做法可以预先处理出一定范围内的所有组合数,将计算多个组合数转化为查表,适用于多次查询组合数的问题。
若)预处理。
注意,当m时,或许直接枚举的做法会更好。
1.3 质因数分解
若p意义下没有逆元,则需要避免使用相应的除法,而是在运算前将分子和分母中的相关项相消,一个显而易见的想法便是将分子和分母所对应的阶乘化为质因数分解式,在质因数的幂次上进行加减法。计算一个数的幂可以利用快速模幂算法做到幂次的对数复杂度。
如果不考虑模)的,可在分母超出存储范围但是精确值不超过存储范围时使用。
而考虑模)。
当)完成组合数的质因数分解。具体做法如下:
- 用筛法计算出正整数x。
- 维护一个数组m各减一。
- 降序枚举x。
- 此时x非负,即为组合数的质因数分解。
当然,如果只有少量数字没有逆元,还可以考虑更改模数。例如,只有x,而如果有多个数字时,也可将模数扩大它们的乘积倍。但一般情况下,这种方法的效率不高。
2. 定理法
这一部分的内容将涉及初等数论中两个常用的定理,利用定理将复杂的问题简单化,从而便于分析。
2.1 卢卡斯定理 (Lucas’s theorem)
在数论中,卢卡斯定理将组合数i,则有
其中,如果)。
当)。
假设能够轻松地(进制转换)得到)。但是希望大家能注意到卢卡斯定理的局限性:它只适用于模质数的情况。
2.2 中国剩余定理 (Chinese Remainder Theorem)
中国剩余定理适用于化简模线性方程组,具体来说,如果有
,其中),那么利用中国剩余定理可以得到
与原方程组等价,其中)。
中国剩余定理实际上利用k次求逆元将方程组进行了合并,而一般情况下可能出现方程组模数不互质的情况,有两种解决办法。一种是将模数分解质因数,划分成多个小的方程组,同质数的方程组再根据幂次判断合法性并合并。另一种是利用二元一次不定方程的通解判断合法性和合并方程组。一般来说,前者需要增加代码量,后者需要一定的推导。
利用中国剩余定理,我们可以将模p不是square-free number时,需要使用下文的一些方法。
3. 其他化归法
这一部分的内容将涉及笔者认为常用的其他化简、归纳方法。笔者不才,私以为将这些方法与前面的结论相结合,可以解决目前大部分组合数求模的问题。
3.1 阶乘表示法
与1.3类似,在这一节我们考虑将组合数表示成e。
组合数可以表示成阶乘和阶乘逆元的乘积,所以我们只要考虑如何表示阶乘。设e。
阶乘!,再次重复上述过程进行提取即可。
提取1时等同于2.1中的预处理。
3.2 分治与多项式
继续分析上一节中的互质的数字乘积问题,在上一节中我们只用到了模1时是十分浪费的。
考虑多项式q个零碎的数字,问题再一次化简。
注意到e意义下进行运算。
考虑这样一个事实:如果已知) ,并且不会使用到高斯泛化的威尔逊定理。
当),可以完成一些相对来说比较大的情况。
3.3 分块与多项式
还是继续分析上一节中的互质的数字乘积问题,在上一节中我们对组合数模大质数问题。
我们需要考虑的是计算!。
多项式)。
在上述过程中涉及到的系数运算都是模修正许多误差且使用优化技巧的FFT可以解决这个问题。
3.4 更复杂的情况
可以发现,当Arithmetic Properties of Binomial Coefficients I: Binomial coefficients modulo prime powers。
4. 例题讲解
这一部分的内容将按照上文内容的顺序依次讲解适用相关方法的例题,目的是加深对相关方法的理解与应用。
Ural 1114 Boxes
简要题意
有b个蓝球,每个盒子可以放任意多个红球和任意多个蓝球,盒子可以空着,球也可以不全放进去,问有多少种放求的方案数。
15
简要题解
红蓝球互不影响,分别计算方案数后相乘即可。而19,因此需要使用64位无符号整型数存储,为了不使运算过程中出现溢出,需要使用质因数分解的方法,套用1.2使用加法预处理组合数即可。
UVaLive 7040 color
简要题意
有7取模的值。
)
简要题解
选出)。
COGS 1284 [HNOI2004] 树的计数
简要题意
已知一个有i,问满足这样的条件的不同的树有多少棵。
18
简要题解
由树的Prüfer序列可知,第18,保险起见最好将式子表示成一些数字的乘积,因此需要套用1.3中的质因数分解方法。
BNUOJ 51637 Quailty’s Life
简要题意
从p取模的值。
31
简要题解
详细题解见BNUOJ 51637 Quailty’s Life | BZOJ 4587 推箱子。
首先对于)。
问题在于计算1,则有
,对应的方案数是
。对于最后的求和部分,先考虑m的情况为
,那么也是枚举m的方案数,但是到终止状态前的一个点是无阻碍的,枚举前一个点算贡献即可。
而计算)。
POJ 2992 Divisors
简要题意
求)的约数个数。
1
简要题解
利用1.3中的线性筛法将)。
ZOJ 2116 Christopher
简要题意
给定正整数m个数。
7
简要题解
将)。
HDU 5446 Unknown Treasure
简要题意
给出P。
18
简要题解
恰好符合2.2中的限定,只需要对于每个质数利用卢卡斯定理求组合数,最后再利用中国剩余定理合并即可。
CDOJ 1177 pow(a, C(n,m) ) % k
简要题意
给出k。
5
简要题解
考虑n 真的足够小,那么可以计算实际值,否则直接计算模意义下的组合数即可。
BZOJ 4535 [Ontak2013]Kapita加强版
简要题意
给出e取模的值。
18
简要题解
设e,就可以利用中国剩余定理得到答案了, 为了算出这四个数,只需要套用3.2的做法。
51nod 1387 移数字
简要题意
对于长度为p取模。
)
简要题解
考虑操作对排列逆序对数奇偶性的变化,第一种操作的变化是偶数,第二种操作的变化与g,具体的替代方法不再赘述。