题意:
一颗无限完全二叉树, 每条边的长度都是一, 求路径长为a, 变化(从左儿子走到右儿子)b次的方案数。
(T <= 1e5 , b < a <= 1e5 ) 答案% 1e9 + 7
思路 : 组合数公式 2 * C( a-1, b) 但数据较多lucas 肯定不行 ( sqrt (mod) * T 爆炸复杂度)
但 a, b 都不是很大, 所以考虑逆元 (需要预处理阶乘即可)
对比 : codeforces869C 只有一组数据, 但需要求和, 所以采用 组合数公式性质 (暴力n^2预处理)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5 + 10;
const ll mod = 1e9 + 7;
ll fac[maxn];
ll a ,b;
ll quick(ll a, ll b)
{
ll ans = 1;
while(b)
{
if(b&1) ans = ans*a%mod;
a = a* a%mod;
b >>= 1;
}
return ans;
}
ll C(ll n, ll m)
{
return fac[n] * quick(fac[m], mod-2)% mod* quick(fac[n-m],mod-2)%mod;
}
int main()
{
fac[0] = 1;
for(int i = 1; i <= 1e5; i++)
fac[i] = fac[i-1] * i % mod;
int t;
scanf("%d", &t);
while(t--)
{
scanf("%I64d%I64d", &a ,&b);
printf("%I64d\n", 2*C(a-1 , b)%mod);
}
return 0;
}