#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define int long long
using ll = long long;
using vl = vector<ll>;
const ll mod = 1000000007;
ll ksm(ll x, ll n) {//快速幂
ll ans = 1;
while (n > 0) {
if (n & 1) {
ans = ans * x % mod;
}
x = x * x % mod;
n >>= 1;
}
return ans;
}
ll ny(ll x) {//快速幂求逆元
return ksm(x, mod - 2);
}
vl jcb, jcnyb;
void initjc(ll n) {//初始化阶乘表和阶乘逆元表
jcb.assign(n + 1, 1);
jcnyb.assign(n + 1, 1);
for (ll i = 1; i <= n; ++i) {
jcb[i] = jcb[i - 1] * i % mod;
}
jcnyb[n] = ny(jcb[n]);
for (ll i = n - 1; i >= 0; --i) {
jcnyb[i] = jcnyb[i + 1] * (i + 1) % mod;
}
}
inline ll C(ll n, ll k) {//组合数公式
if (k < 0 || k > n) return 0;
return jcb[n] * jcnyb[k] % mod * jcnyb[n - k] % mod;
}
void solve() {
int n, m;cin >> n >> m;
cout << C(m, n) << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
int t = 1;
cin >> t;
initjc(5e5 + 10);
for (int i = 1; i <= t; i++) {
//cout << "----Test " << i << "----" << endl;
solve();
}
return 0;
}
初始化阶乘表和阶乘逆元表,逆元要用到费马小定理和快速幂,带入组合数公式即可,注意这里模数一定要是质数才有意义。

京公网安备 11010502036488号