• 【u104】组合数


    Time Limit: 1 second
    Memory Limit: 128 MB

    【问题描述】

    组合数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。


    【输入格式】

    输入文件com.in的第1行为两个非负整数N,K。

    【输出格式】

    输出文件com.out包括1个非负整数,

    【数据规模】

    对于100%的数据,N≤1000,K≤1000。

    Sample Input1

    4 2
    
    
    
    
    
    
    

    Sample Output1

    6
    
    【题解】
    高中学二项式定理的时候有接触到一点。所以还是会有点印象的。那些c(n,k)什么的,实际上是和杨辉三角对应的。
    然后用给的递推式递推就可以了。注意取模;
    【代码】
    #include <cstdio>
    
    int n,k,c[1001][1001];
    
    int main()
    {
    	scanf("%d%d",&n,&k);
    	for (int i = 0;i<= n;i++)
    		c[i][0] = 1,c[i][i] = 1; //这是边界条件。杨辉三角可以不用但是c(n,0)输出应该是1而不是0 
    	for (int i = 1;i <= n;i++)
    		for (int j =0;j <= i;j++) //一边取模一边递推。 
    			c[i][j] = (c[i-1][j]+c[i-1][j-1]) % 100003;
    	printf("%d",c[n][k]);
    	return 0;	
    }


  • 相关阅读:
    Redis使用详细教程
    Web API 强势入门指南
    log4net
    ASP.NET Web API——选择Web API还是WCF
    Hadoop RPC机制
    力扣算法:每日温度
    力扣算法:完全平方数
    力扣算法:岛屿数量
    面试总结二
    面试总结
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632331.html
Copyright © 2020-2023  润新知