记录一下

在预处理逆元的时候,需要给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%掉)

posted @ 2024-04-14 08:16  shaoyufei  阅读(29)  评论(0)    收藏  举报