在預處理逆元的時候,需要給inv[0]賦值為1,雖然0的逆元為0(或是無意義)
但計算inv[m]* inv[n-m]%p時為避免(m= =n)導致誤差
所以要去給inv[0]賦值1
但單點求就不用,因為fact[0]=1已經避免這種情況即
qpow(fact[m]* fact[n-m],p-2,p)中fact[m]*fact[n-m]不會因為n==m而造成誤差變成0
還有就是,huge的中國剩餘定理板子中的a[i]是餘數,r[i]是除數(應該是這樣)
點選檢視程式碼
LL CRT(int k, LL a[], LL r[]) {
LL n = 1, ans = 0;
for (int i = 1; i <= k; i++) n = n * r[i];
for (int i = 1; i <= k; i++) {
LL m = n / r[i], b, y;
exgcd(m, r[i], b, y); // b * m mod r[i] = 1
ans = (ans + a[i] * m * b % n) % n;
}
return (ans % n + n) % n;
}
還有就是,lucas定理中需要的階乘和逆元數量最大僅需
max({m%p,n%p,p-1});
(>=p的都會被p%掉)