组合数(codevs 1631)

1631 组合数

 

 时间限制: 1 s
 空间限制: 256000 KB
 题目等级 : 钻石 Diamond
 
 
题目描述 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;
}
View Code
原文地址:https://www.cnblogs.com/harden/p/5618166.html