数学知识,数论

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;
	//组合数公式,不能直接除,求逆元。
}

递推求组合数,适合小范围的数,打表。

递推的公式:c_n^m = c_{n-1}^{m-1} + c_{n-1}^m

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;
    }
}

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值