zoukankan      html  css  js  c++  java
  • 组合数(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
  • 相关阅读:
    axis2 WebService的发布与调用
    Lucene、Compass学习以及与SSH的整合
    qsort函数应用大全
    Effective C++ ——模板和泛型编程
    Effective C++ ——继承与面向对象设计
    Effective C++ ——实现
    Effective C++ ——设计与声明
    Effective C++ ——资源管理
    Effective C++ ——构造/析构/赋值运算符
    Effective C++ ——让自己习惯C++
  • 原文地址:https://www.cnblogs.com/harden/p/5618166.html
Copyright © 2011-2022 走看看