算法概念
杨辉三角,又称帕斯卡三角形(Pascal’s Triangle),是数学上的一个著名排列组合形式,它在代数、组合数学、概率论等多个数学领域都有广泛的应用。这个三角形以法国数学家布莱士·帕斯卡的名字命名,但实际上它在帕斯卡之前就已被中国的数学家所知,并在中国古代数学著作《张丘建算经》和《缉古算经》中都有记载,因此也被称为“杨辉三角”,以纪念中国南宋时期的数学家杨辉。
杨辉三角的构造规则很简单:
- 每行数字左右对称,由1开始逐渐变大。
- 每个数是它左上方和右上方的两个数之和(即“肩膀”上的两个数之和)。
- 每行第一个数和最后一个数都是1。
以下是杨辉三角的前几行:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
杨辉三角在数学上有许多的性质和应用,例如:
- 它与二项式系数(组合数)紧密相关。在杨辉三角中,第n行的第k个数恰好是(n, k)的二项式系数,即C(n, k) = n! / (k!(n-k)!),其中n!表示n的阶乘。
- 它与幂的展开式有关。例如,(a+b)^n的展开式中的各项系数可以直接从杨辉三角的第n行中读取。
- 它还涉及到许多数学定理和公式的证明,如范德蒙德恒等式等。
算法步骤
- 初始化:
- 创建一个二维数组
C[n+1][k+1]
(注意数组大小要比 n 和 k 各大 1),用于存储组合数。 - 将所有
C[i][0]
初始化为 1(基于基础情况)。
- 创建一个二维数组
- 填充数组:
- 使用两个嵌套的循环遍历数组
C
的元素(除了已经初始化的边界)。外层循环变量i
从 1 到n
,内层循环变量j
从 1 到i
(因为C[i][j]
只依赖于C[i-1][...]
的值)。 - 对于每个
C[i][j]
,根据递推关系C[i][j] = C[i-1][j-1] + C[i-1][j]
进行计算。
- 使用两个嵌套的循环遍历数组
算法模板
vector<vector<int>> combination(int n,int mod=1e9+7){
vector<vector<int>> C(n+1,vector<int>(n+1));
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]+C[i-1][j-1])%mod;
return C;
}
vector<int> combination(int n) {
vector<int> row(n + 1, 1);
for (int i = 1; i <= n; ++i)
for (int j = i - 1; j > 0; --j)
row[j] = row[j] + row[j - 1];
return row;
}
模板题
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MOD=10007;
int modPow(int n, int k, int mod=MOD) {
int r = 1;
for (; k; k >>= 1, n = n * n % mod)
if (k & 1) r = r * n % mod;
return r;
}
vector<int> combination(int n,int mod=MOD) {
vector<int> row(n + 1, 1);
for (int i = 1; i <= n; ++i)
for (int j = i - 1; j > 0; --j)
row[j] = (row[j] + row[j - 1])%mod;
return row;
}
signed main() {
int a, b, k, n, m;
cin >> a >> b >> k >> n >> m;
vector<int> C=combination(k);
cout<<C[n]*modPow(a,n)%MOD*modPow(b,m)%MOD<<endl;
return 0;
}