poj 2249 Binomial Showdown(组合数 公式优化)
来源:互联网 发布:java 解语法糖 编辑:程序博客网 时间:2024/05/18 01:48
// 组合数学,开始了……
题目地址 : poj 2249 Binomial Showdown
Description
In how many ways can you choose k elements out of n elements, not taking order into account?
Write a program to compute this number.
Write a program to compute this number.
Input
The input will contain one or more test cases.
Each test case consists of one line containing two integers n (n>=1) and k (0<=k<=n).
Input is terminated by two zeroes for n and k.
Each test case consists of one line containing two integers n (n>=1) and k (0<=k<=n).
Input is terminated by two zeroes for n and k.
Output
For each test case, print one line containing the required number. This number will always fit into an integer, i.e. it will be less than 231.
Warning: Don't underestimate the problem. The result will fit into an integer - but if all intermediate results arising during the computation will also fit into an integer depends on your algorithm. The test cases will go to the limit.
Warning: Don't underestimate the problem. The result will fit into an integer - but if all intermediate results arising during the computation will also fit into an integer depends on your algorithm. The test cases will go to the limit.
Sample Input
4 210 549 60 0
Sample Output
625213983816
Source
Ulm Local 1997
/******************************
组合数公式的优化
普通的组合数公式:C(n,m) = n!/((n-m)!*m!) = (n * n-1 * n-2 * n-3 * n-4 * n-5 * n-6 * …… * n-m) / (m * m-1 * m-2 * m-3 * m-4 * m-5 * …… * 2 * 1)
优化 :将分子和分母 的因子分别存到一个数组中 nn[] (分子) mm[] (分母),双重循环遍历, 进行各个因子约分,因为 组合数为一个整数 ,即N % M = 0,
所以mm[] 的元素一定可以全部约分为1,然后只需将 mm[] 中的元素相乘就行了。。
******************************/
#include <iostream>#include<string.h>#include <stdio.h>using namespace std;const int N = 10000;int nn[N],mm[N];int gcd(int a,int b)// 求n,m 的最大公约数{ return (b==0)?a:gcd(b,a%b);}int main(){ int i,j,n,m,t,h,sum,temp; while(cin>>n>>m&&(n||m))// 程序结束条件是 n,m 中一个为0就行,用||,我开始用&& WA了好多次,要注意 { t = h = 0; sum = 1; //cout<<gcd(m,n)<<endl; if(m>n-m) m = n-m; for(i = n-m+1;i<=n;i++)// 分子赋值 nn[t++] = i; for(i = 1;i<=m;i++)// 分母赋值 mm[h++] = i; for(i = 0;i<m;i++) { for(j = 0;j<m;j++) { temp = gcd(nn[i],mm[j]);// 约分 nn[i] = nn[i]/temp; mm[j] = mm[j]/temp; } } for(i = 0;i<m;i++) sum*=nn[i]; cout<<sum<<endl; }}
0 0
- poj 2249 Binomial Showdown(组合数 公式优化)
- POJ 2249 Binomial Showdown(组合数)
- POJ 2249 Binomial Showdown (连乘整商求组合数)
- [ACM] poj 2249 Binomial Showdown (排列组合公式优化)
- POJ 2249 Binomial Showdown 求组合数C(n,k)
- poj 2249 Binomial Showdown[C(n, m)组合数求解]
- Poj.2249 Binomial Showdown【组合数】 2015/09/23
- (组合数学3.1.2.1)POJ 2249 Binomial Showdown(排列组合公式的实现)
- poj 2249 Binomial showdown
- poj 2249Binomial Showdown
- Poj 2249 Binomial Showdown
- poj 2249 Binomial Showdown
- poj 2249 Binomial Showdown
- POJ 2249 Binomial Showdown 笔记
- 简单计算求组合数 Binomial Showdown
- poj2249 Binomial Showdown 求组合数
- POJ 题目2249 Binomial Showdown(数学)
- POJ 2249-Binomial Showdown(排列组合计数)
- 生产者和消费者
- JDK5.0垃圾收集优化之--Don't Pause
- Apache2.2.16+PHP5.3.3+MySQL5.1.49的配置方法
- php 將url轉換成html鏈接
- 【VC6.0】rand()
- poj 2249 Binomial Showdown(组合数 公式优化)
- poj 2031 Building a Space Station (最小生成树)
- 善用设计模式-代理模式
- 深入浅出UML类图(二)
- Eclipse背景颜色修改
- struts Value Stack 值栈
- 微软IE浏览器发现新安全漏洞
- PHP获得数组的交集与差集
- 完全背包