如题。我发现在计算 (n!)pmodpk 时,我采用如下算法:
pair <int, int> calc (int64_t n) {
int64_t f = 1, c = 0;
bool ubd = n < p;
while (n) (f *= fact[n % p]) %= p_k, c += n /= p;
(f *= (ubd ? 1 : fpow (fact[p-1], c, p_k))) %= p_k;
return { f, c };
}
其中 p_k 是 pk,fact[x] 表示 x!modpk。c 满足 pc∣n!∧pc+1∤n!。很明显我每一步分治以 p 为阶段划分(当时脑子抽了以为 (tp−1)p−1≡((t−1)p−1)p−1(modp)k,t>0),所以最后乘上了 (p−1)cmodpk。但正确方式显然是以 pk 为阶段划分。
可是它过了模板诶!
请问是数据水导致一定有 k=1 还是别的什么原因?