1不能用费马小定理求逆元
有公式 a / b % mod = a %(mod * b)/b
2 递归求逆元
mod必须为素数
LL inv(LL i)//mod必须是素数
{
if(i==1)return 1;
return (mod-mod/i)*inv(mod%i)%mod;
}
3 求组合数
求一个组合数的值,由于数组大小有限,所以,能求的最大数也有限。
void init() {
fac[0] = 1;
ll i;
for (i = 1; i < maxn; i++)
{
fac[i] = (fac[i - 1] * i) % mod;
}//预处理阶乘
}
ll qpow(ll a, ll c) {
ll ans = 1;
a %= mod;
while (c)
{
if (c & 1)ans = (ans * a) % mod;
a = (a*a) % mod;
c /= 2;
}
return ans;//快速幂主要用来求逆元
}
ll com(ll n, ll m){
return fac[n] * qpow(fac[m] * fac[n - m] % mod, mod - 2) % mod;
//组合数公式,不能直接除,求逆元。
}
递推求组合数,适合小范围的数,打表。
递推的公式:
long long C[N][N];
void get_C(int maxn)
{
C[0][0] = 1;
for(int i=1;i<=maxn;i++)
{
C[i][0] = 1;
for(int j=1;j<=i;j++)
C[i][j] = C[i-1][j]+C[i-1][j-1];
//C[i][j] = (C[i-1][j]+C[i-1][j-1])%MOD;
}
}