381 Prime Factorial
对于一个质数 来说,。
举个例子 因为 , 所以 。
对于 ,求 。
题目给了一个可以检验程序是否写正确的示例:。
根据 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 到 所有的质数,利用的是埃拉托斯特尼筛选法。
由于得到的逆元可能很大,也可能是负数,所以模 后加了 再进行一次模运算。