10.19
找规律题目,在图上推推就发现,一个是起点下面的数,一个是起点右下角的数。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#define LL long long
using namespace std;
const LL mod = 1e9 + 7;
LL mub[1000010];
LL x, y;
void init(){
mub[0] = 1;//
for(int i=1; i<=1000010; i++){
mub[i] = mub[i-1] * i % mod;
}
}
LL exgcd(LL a, LL b, LL &x, LL &y){
if(a == 0 && b == 0)
return -1;
if(b == 0){
x = 1; y = 0;
return a;
}
LL d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
LL mod_reverse(LL a, LL n){
LL d = exgcd(a, n, x, y);
if(d == 1)
return ( x % n + n ) % n;
else
return -1;
}
LL solve(int a, int b){
if(a > b) return 0;
LL nn = mod_reverse((mub[a] * mub[(b + mod - a) % mod]) % mod, mod);
return mub[b] * nn % mod;
}
int main(){
freopen ("sumcomb.in", "r", stdin);
freopen ("sumcomb.out", "w", stdout);
int T; scanf("%d", &T);
init();
while ( T-- ){
int opt, a, b; scanf("%d%d%d", &opt, &a, &b);
if(a > b) { printf("0\n"); continue;}
if(opt == 1) printf("%I64d\n", solve(b+1, a+1));
else printf("%I64d\n", solve(b, a+1));
}
}