爱喝「肥宅快乐水」的班长

题目描述

现在已经是暑假了!这周日,码队的弟弟所在的班级——上海某中学高二 33 班的同学们准备在码队弟弟的带领下(码队的弟弟是这个班的班长),举办一场派对。

码队的弟弟让两名同学打开手机 「云闪付」app,在云闪付在线商城上采购饮料。经过这两名同学统计,发现一共需要买 nn 瓶饮料。而在云闪付在线商城上,一共有 mm 种不同的饮料(包括「肥宅快乐水」,并假设云闪付在线商城上的每种饮料的购买数量都没有限制)。由于码队的弟弟喜欢喝「肥宅快乐水」,所以这两名同学决定至少要买一瓶「肥宅快乐水」。

这样看来,饮料购买的方案实在是太多了!两位同学突发奇想,想让你帮忙计算:总共有多少种购买饮料的方案。(答案对 10^9 + 7109+7 取模,同种饮料都是一样的,不作区分。)

输入格式

有多组数据。

第一行输入一个整数 TT, 表示有 TT 组数据( 1le T le 10^41T104 )。

对于每一组测试数据:输入一行,包含两个整数 n, mn,m,以空格分隔,分别表示这两位同学需要买 nn 瓶饮料(其中必须有一瓶是「肥宅快乐水」),云闪付在线商城中一共有 mm 种包括「肥宅快乐水」在内的不同的饮料。(1 le n,m le 10^31n,m103)

输出格式

对于每一组测试数据,输出一行。

每行只包含一个整数,表示有多少种购买饮料的方案。

提示

假设我们用 FF 表示「肥宅快乐水」,用 AA 表示某种其他饮料。


针对样例输入 1:


对于第一组测试数据,只有 11 种购买饮料的方案:(FF)。


对于第二组测试数据,有 22 种购买饮料的方案:(FF, FF),(FF, AA)。

输出时每行末尾的多余空格,不影响答案正确性

样例输入1

2
1 1
2 2

样例输出1

1
2

样例输入2

3
1 2
2 3
3 3

样例输出2

1
3
6
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
const ll mod=1e9+7;
const double eps=1e-7;
ll T,n,m;
ll f[3006][3006];
int main() {
    //freopen("1.txt","r",stdin);
    f[0][0]=1;
    for(register int i=1;i<=3003;++i){
        f[i][0]=1;
        for(register int j=1;j<=3003;++j){
            f[i][j]=(f[i-1][j-1]+f[i-1][j])%mod;
        }
    }
    scanf("%lld",&T);
    while(T--){
        scanf("%lld%lld",&n,&m);
        printf("%lld
",f[n+m-2][m-1]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/czy-power/p/11334141.html