381 Prime Factorial

Problem 381

对于一个质数 来说,

举个例子 因为 , 所以

对于 ,求

题目给了一个可以检验程序是否写正确的示例:

根据 Wilson's theorem 可以得到下面等式:

这玩意如何整成整数呢?

下面给出逆元的定义:

对于整数 ,如果存在整数 ,满足 ,则说, 的模 乘法逆元。并且 存在模 的乘法逆元的充要条件是 。 显然, 互质。

那么如何求逆元呢?考虑 扩展欧几里得算法 显然, 的逆元就是扩展欧几里得算法中的

到此为止,基础的数学知识都已经准备妥当,开始写代码吧。

var primes = Utils.GenPrimes(100000000);
for (int i = 2; i < primes.Length; i++)
{
    long p = primes[i];
    long a = 0;
    long p2 = 0;
    long p3 = 0;
    long p4 = 0;
    Utils.GetGcd(p, p - 2, ref a, ref p2);
    Utils.GetGcd(p, p - 3, ref a, ref p3);
    Utils.GetGcd(p, p - 4, ref a, ref p4);

    long s3 = ((p2 % p) + p) % p;
    long s4 = ((s3 * p3) % p + p) % p;
    long s5 = ((s4 * p4) % p + p) % p;
    long s = ((s3 + s4 + s5) % p + p) % p;
    sum += s;
}

return sum;
简单的解释一下,primes 是 2 到 所有的质数,利用的是埃拉托斯特尼筛选法。

由于得到的逆元可能很大,也可能是负数,所以模 后加了 再进行一次模运算。