威尔逊定理

下面是一道很典型的涉及到数论的编程问题(原题链接:https://icpcarchive.ecs.baylor.edu/external/43/4382.html)。

威尔逊定理_第1张图片

而要解这个问题,使用穷举或暴搜的方法显然不可取。若要优雅而巧妙地解决这个问题,就需要用到一个关于素数的著名结论——威尔逊定理(Wilson's theorem)。


十八世纪中叶,一位英国法官约翰·威尔逊爵士,发现了数论中一种极为罕见的关系:取从1到某个质数所有连续正整数的乘积,例如从1乘到11,即11的阶乘11!,显然,11!能被从1到11的所有整数整除。略去11,得10!。无疑10!不能被11整除。然而,如果给10!加上1的话,1×2×3×4×5×6×7×8×9×10+1=3628801,怎么也不会想到,3628801却能被11整除(3628801÷11=329891)。类似地,从1到质数7的阶乘7!中略去7,再加上1,得1×2×3×4×5×6+1 = 721,721也能被7整除(721÷7=103)。11和7都是质数,研究发现,此种整除性对一切质数都成立,但对合数却不成立。


把上面所说的加以推广,就得到威尔逊定理:当且仅当 n 为质数时,(n-1)!+1能被 n 整除。(逆定理也成立)

或者用公式表示为


威尔逊定理给出了判定一个自然数是否为素数的充分必要条件。但是由于阶乘是呈爆炸增长的,其结论对于实际操作意义不大。威尔逊定理的第一个证明是由拉格朗日给出的。


下面仅讨论充分性的证明。即证明当 n 满足上式时,n只能为素数。
首先,假设 n 不是素数,那么令 n=a×b ,其中1 < a < n-1,1 < n < p-1。

  1. 若a≠b, 因为 (n-1)!=1×2×...×a×...×b×...×n-1,
    所以 (n-1)!≡ 0 (mod a);(n-1)!≡ 0 (mod b),以及 (p-1)!≡ 0 (mod a×b) ,
    即 (n-1)!≡ 0 (mod n)。这与( n -1 )! ≡ -1 ( mod n )  矛盾。
  2. 若a=b, 因为(n-1)!=1×2×...×a×......×n-1,       

        所以(n-1)!≡ 0 (mod a) 以及 (n-1)!≡ 0 (mod 2a)。

        注意,2×a < a×a=n,所以(n-1)!=1×2×...×a×...×2a×......×n-1

        可得(n-1)!≡ 0 (mod a×2a) => (n-1)!≡ 0 (mod a×a) ,即 (n-1)!≡ 0 (mod n)
        这与( n -1 )! ≡ -1 ( mod n )  矛盾。

        所以 n 只能是素数,即充分性得证。


现在回过头来看本文最初给出的问题。分两种情况讨论。

(1)3k+7为素数时,那么由威尔逊定理可知


此时有(注意这里中括号的意思已由题目中红色方框标注的地方加以说明)

所以

(2)3k+7为合数时,那么3k+7可以写成3k+7=ab,那么很明显a和b在(3k+6)!中都会出现,所以


此时有



所以解法就是筛出素数表,然后从0到10^6,判断素数,是素数就等于前一项的值+1,不是素数就直接等于前一项的值,答案保存到一个数组中即可。

你可能感兴趣的:(数据结构与算法)