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