题目描述 Description
组合数C(N, K)表示了N个数字不重复地选取K个作组合的方案数。
C(N, K) = N!/(N-M)!M!
当然,在取余数的条件下,由于除法的限制,上述公式求C(N, K) mod H不方便,并且高精度除法也不容易写,所以一般情况下我们采取的是下列方法。
若N,K不大,可以通过递推的方法求出所有组合数。
首先,N个数取0个数显然只有1种方案,那就是什么都不取;
接着,N个数取N个数的组合显然也只有1种方案。
所以C(N, 0) = 1,C(N, N) = 1
其他情况下,C(N, K) = C(N - 1, K) + C(N – 1, K – 1),这样就可以通过递推求出所有组合数。
你可以看到,其实结果其实就是杨辉三角形。
现在对于给定的N和K,请输出C(N, K) mod 100003。
输入描述 Input Description
输入文件com.in的第1行为两个非负整数N,K。
输出描述 Output Description
输出文件com.out包括1个非负整数
样例输入 Sample Input
4 2
样例输出 Sample Output
6
/* 组合数:杨辉三角 递推公式 f[i][j]=f[i-1][j-1]+f[i-1][j] */ #include<cstdio> #include<iostream> #define Mod 100003 #define M 1010 using namespace std; int f[M][M]; int main() { int n,k; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) f[i][0]=f[i][i]=1; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(!f[i][j]) f[i][j]=f[i-1][j-1]+f[i-1][j]; f[i][j]%=Mod; } printf("%d",f[n][k]); return 0; }