是否有一种简单的方法可以实施!n mod p
(number of derangements)where n ≤ 2∗10^8
而p
是素数而p < 1000
程序必须快速执行,因此天真的方法不起作用。
答案 0 :(得分:8)
事实证明,!n mod p
是周期性的,期间为2p
。因此,我们可以将!n mod p
计算为!(n mod 2p) mod p
,我们使用紊乱!n = (n-1) (!(n-1) + !(n-2))
的递归公式进行计算。
证明:
!(p+1) = 0 mod p
。!(n+p) = !p * !n
(这可以使用先前的观察结果进行归纳证明)。!p = -1 mod p
。维基百科提供了一个公式:!n = n! - Sum[(n choose i) * !(n-i), i=1..n]
- 模p,右侧唯一的非零术语显示在i=n
的位置。!(n+2p) = !p !p !n = !n mod p
。从证据中我们发现,当!n = ± !(n mod p) mod p
小于n mod 2p
时,我们可以实际计算p
符号为正的位置。
答案 1 :(得分:0)
使用递归公式(!n = (n - 1) (!(n-1) + !(n-2))
),为什么不实现“乘法模p
”和“加模p
”操作?