【题目来源】
https://www.luogu.com.cn/problem/B2164
【题目描述】
给定两个正整数 n 和 m,请你计算从 n 个不同的元素中选择 m 个元素的方案数(选择的顺序不重要)。
由于方案数可能很大,请输出方案数对 10^9+7 取模的结果,也就是输出方案数除以 10^9+7 的余数。
【输入格式】
一行,包含两个整数 n 和 m
【输出格式】
一个整数,表示组合数 C(n,m) 对 10^9+7 取模的结果。
【输入样例】
5 3
【输出样例】
10
【数据范围】
对于 20% 的数据,满足 1≤m≤n≤10
对于 100% 的数据,满足 1≤m≤n≤5000
【算法分析】
(1)杨辉三角第 n 行(n≥1)包含 n 个数字,对应二项式 (a+b)ⁿ⁻¹ 展开式的系数。 其中,(a+b)ⁿ = C(n,0)aⁿ + C(n,1)aⁿ⁻¹b¹ + C(n,2)aⁿ⁻²b² + ... + C(n,n-1)a¹bⁿ⁻¹ + C(n,n)bⁿ
(2)杨辉三角第 n 行第 k 个数等于组合数 C(n-1,k-1)。 其中,C(n,k) = n! ∕ (k!·(n−k)!)。
【算法代码】
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=5e3+5;
int c[N][N];
const int MOD=1e9+7;
int main() {
for(int i=0; i<N; 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;
}
}
int x,y;
cin>>x>>y;
cout<<c[x][y]<<endl;
return 0;
}
/*
in:5 3
out:10
*/
【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/147570319
https://www.luogu.com.cn/problem/solution/B2164