威尔逊定理
1 威尔逊定理
内容:
对于素数
推论:
计算余数算法:
实现
时间复杂度: 时间复杂度为
int factmod(int n, int p) {
vector<int> f(p);
f[0] = 1;
for (int i = 1; i < p; i++) f[i] = f[i - 1] * i % p;
int res = 1;
while (n > 1) {
if ((n / p) % 2) res = p - res;
res = res * f[n % p] % p;
n /= p;
}
return res;
}
2 公式:
其中
特别地,阶乘中 2 的幂次是
int multiplicity_factorial(int n, int p) {
int count = 0;
do {
n /= p;
count += n;
} while (n);
return count;
}
3 定理:
即
特别地,组合数中 2 的幂次是
4 定理的推广:
对于素数