885 求组合数 I(递推法)

1. 问题描述:

给定 n 组询问,每组询问给定两个整数 a,b,请你输出 Cba mod(10 ^ 9+7) 的值。

输入格式

第一行包含整数 n。接下来 n 行,每行包含一组 a 和 b。

输出格式

共 n 行,每行输出一个询问的解。

数据范围

1 ≤ n ≤ 10000,
1 ≤ b ≤ a≤ 2000

输入样例:

3
3 1
5 3
2 2

输出样例:

3
10
1
来源:https://www.acwing.com/problem/content/description/887/

2. 思路分析:

因为数据规模不是特别大,所以可以使用递推的方法来求解组合数,可以使用一个公式:C(n,m) = C(n - 1, m) + C(n - 1,m - 1)来求解,我们其实是根据在n个数字中选择当前的数字或者不选当前的数字的情况将这两类情况相加起来。

3. 代码如下:

class Solution:
    # 递推法求解组合数
    def process(self):
        # 先预处理出结果
        N = 2010
        f = [[0] * N for i in range(N)]
        mod = 10 ** 9 + 7
        for i in range(N):
            j = 0
            while j <= i:
                if j == 0:
                    f[i][j] = 1
                else:
                    f[i][j] = (f[i - 1][j] + f[i - 1][j - 1]) % mod
                j += 1
        n = int(input())
        for i in range(n):
            a, b = map(int, input().split())
            print(f[a][b])


if __name__ == '__main__':
    Solution().process()
上一篇:vConsole 移动端调试


下一篇:885.求组合数 I(模板)