sumcomb (组合数)

来源:互联网 发布:网站编程语言培训机构 编辑:程序博客网 时间:2024/06/07 17:45

10.19

找规律题目,在图上推推就发现,一个是起点下面的数,一个是起点右下角的数。

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#define LL long longusing 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));    }}
原创粉丝点击