記錄一下

shaoyufei發表於2024-04-14

在預處理逆元的時候,需要給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%掉)

相關文章