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