组合数(2) 排列组合—— 数据范围超大(10w)


 

这里预处理要用到快速幂求逆元的操作。。。忘记了就复习。

#include 
#include 
using namespace std;
typedef long long LL;
const int N = 1000010, mod = 1e9 + 7;
int fact[N], infact[N];
int n;

LL qmi(int a, int b, int p)
{
    LL ans = 1;
    while(b)
    {
        if(b & 1) ans = (LL) ans * a % p;
        b >>= 1;
        a = (LL) a * a % p;
    }
    
    return ans;
}
int main()
{
    cin >> n;
    
    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;
    }
    while(n--)
    {
        int a, b;
        cin >> a >> b;
        cout << (LL)fact[a] * infact[b] % mod * infact[a-b] % mod << endl;
    }
    
    return 0;
}