组合数计算公式 数论笔记

今天的牛客网比赛的第二题一脸懵逼啊。。赛后看别人代码才知道了一种新的组合数公式计算方法。

(a/b)%mod这个a/b在b比较大的时候在计算机里的精度有损失,所以我们将它转化为(a*c)%mod的形式,

这里引入逆元的概念:(b*c)=1(%mod) ,那么(a/b)%mod=(a*c)%mod,这里就避免了精度损失。

逆元的求法有好几种方法,我学了费马小定理,以后再补上其他的方法。

费马小定理:

设inv[i]为i的逆元。

费马小定理

a^(p-1) ≡1 (mod p)

两边同除以a

a^(p-2) ≡1/a (mod p)

a^(p-2) ≡ inv(a) (mod p)

运用快速幂可以很快得到。

下面给出牛客这道运用组合数公式的题的代码:

题目链接:点击打开链接

AC代码:

#include 

using namespace std;

const int mod = 998244353; //mod的数必须为质数
const int maxn = 1e5+7;

long long inv[maxn],fac[maxn];

long long power_mod(long long a,long long b)
{
    long long res=1LL;
    long long base=a;
    while(b)
    {
        if(b&1) res=base*res%mod;
        base=base*base%mod;
        b=b>>1;
    }
    return res;
}

int main()
{
    fac[0]=1;
    inv[0]=1;
    for(int i=1;i

你可能感兴趣的:(数论)