886. 求组合数 II

发布时间:2024年01月18日
#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N=100010,mod=1e9+7;

int fact[N],infact[N];

int qmi(int a,int k,int p)
{
    int res=1;
    while(k)
    {
        if(k&1)
        {
            res=(LL)res*a%p;
        }
        a=(LL)a*a%p;
        k>>=1;
    }
    return res;
}

int main()
{
    fact[0]=infact[0]=1;
    for(int i=1;i<N;i++)
    {
        fact[i]=(LL)fact[i-1]*i%mod;
        infact[i]=(LL)infact[i-1]*qmi(i,mod-2,mod)%mod;
    }
    
    int n;
    cin>>n;
    while(n--)
    {
        int a,b;
        cin>>a>>b;
        
        cout<<(LL)fact[a]*infact[b]%mod*infact[a-b]%mod<<endl;
    }
    
    return 0;
}

上一题使用递推来求解,这一题使用公式来求解,因为这一题的数据范围更大

公式是这个

在这里插入图片描述
使用公式就行,把阶乘和逆元预处理出来,逆元预处理的时候要使用快速幂模板,算法基础课基本就是背模板就行了,我的任务就是像背单词一样背模板就行了

两个int数据范围的数字相乘不会超出long long的数据范围,但是3个相乘就会超过,所以两个数相乘就要取一次模

以上

文章来源:https://blog.csdn.net/L3102250566/article/details/135669635
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。