AcWing 885:求组合数 I ← 杨辉三角
【题目来源】
https://www.acwing.com/problem/content/887/
【题目描述】
给定 n 组询问,每组询问给定两个整数 a,b,请你输出 C(a,b) 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
【算法分析】
● 本题利用公式 C(i, j)=C(i-1, j-1)+C(i-1, j) 进行组合数求解。
● 杨辉三角是二项式系数在三角形中的一种几何排列。
(1)杨辉三角第 n 行包含 n 个数字,对应二项式 (a+b)ⁿ⁻¹ 展开式的系数。
(2)杨辉三角第 n 行第 k 个数等于组合数 C(n-1,k-1)。
(3)杨辉三角第 n 行的数字和为 2ⁿ⁻¹。
(4)杨辉三角左对齐后,沿 45° 斜线(↙方向)的数字和构成斐波那契数列。
(5)杨辉三角左对齐后,第 i 行第 j 列的数=第 i-1 行第 j-1 列的数+第 i-1 行第 j 列的数。正是组合数性质 C(i, j)=C(i-1, j-1)+C(i-1, j) 的几何体现。
【算法代码】
#include<bits/stdc++.h>
using namespace std;int c[2005][2005];
const int mod=1e9+7;int main() {int n;cin>>n;for(int i=0; i<=2000; i++) {for(int j=0; j<=i; j++) {if(j==0) c[i][j]=1;else c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;}}while(n--) {int x,y;cin>>x>>y;cout<<c[x][y]<<endl;}return 0;
}/*
in:
3
3 1
5 3
2 2out:
3
10
1
*/
【参考文献】
https://www.acwing.com/solution/content/87578/
https://blog.csdn.net/hnjzsyjyj/article/details/147568269
https://www.acwing.com/solution/content/21902/
https://blog.51cto.com/u_15302000/4981839