博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ACM] poj 2249 Binomial Showdown (排列组合公式优化)
阅读量:5462 次
发布时间:2019-06-16

本文共 1854 字,大约阅读时间需要 6 分钟。

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.

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.

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 2
31.
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

解题思路:

本题题意很明确,就是让求C(n,m)是多少,但传统的组合公式计算过程中会越界,所以采用另一种思路,把组合公式的分子和分母的数字分别存到两个数组中,然后两层循环,分别求出分子和分母的最大公约数,然后约分,这样把分子分母化成最简。最后再采用传统的组合公式就可以了。

代码:

#include 
using namespace std;const int maxn=3000;int up[maxn],down[maxn];//分别存分子和分母的数int gcd(int a,int b){ if(!a) return b; int c; while(b) { c=b; b=a%b; a=c; } return a;}int main(){ int n,m; while(cin>>n>>m&&(m||n)) { if(m>n-m) m=n-m; int temp=n; for(int i=1;i<=m;i++)//根据组合公式把原始的分子分母分别存在数组中 { up[i]=temp--; down[i]=i; } for(int i=1;i<=m;i++)//外层循环代表分母,对分母依次进行约分 for(int j=1;j<=m;j++) { temp=gcd(down[i],up[j]); if(temp>1) { up[j]/=temp; down[i]/=temp; } if(down[i]==1)//分母已经为1,退出,进行下一个分母的约分 break; } int mul=1; for(int i=1;i<=m;i++) mul=mul*up[i]/down[i]; cout<
<

转载于:https://www.cnblogs.com/vivider/p/3697678.html

你可能感兴趣的文章
HttpContext.Current.Request.ServerVariables.AllKeys
查看>>
django 配置中STATICFILES_DIRS 和STATIC_ROOT不能同时出现
查看>>
MySQL 学习笔记 二
查看>>
Liunx Shell入门
查看>>
C++ 总结
查看>>
poj2593 Max Sequence(两个不相交字段的最大总和与)
查看>>
Mustache 使用心得总结
查看>>
BZOJ 3224: Tyvj 1728 普通平衡树
查看>>
基于PCA的人脸识别步骤
查看>>
perl学习(2) 基本数据类型等
查看>>
组队练习赛(Regionals 2012, North America - East Central NA)
查看>>
libevent源码剖析
查看>>
第24条:将类的实现代码分散到便于管理的数个分类之中
查看>>
LINQ-进行数据转换
查看>>
Yii 事件行为的过程详解(未完待续。。)
查看>>
Solr与MongoDB集成,实时增量索引[转]
查看>>
最长不下降子序列的O(n*logn)算法
查看>>
设计模式(十七)——模板方法模式
查看>>
uva 10954 Add All
查看>>
如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问。
查看>>