hdu 2519 - 求解组合数
来源:互联网 发布:java date sethour 编辑:程序博客网 时间:2024/05/01 08:34
Problem Description
开学了,杭电又迎来了好多新生。ACMer想为新生准备一个节目。来报名要表演节目的人很多,多达N个,但是只需要从这N个人中选M个就够了,一共有多少种选择方法?
Input
数据的第一行包括一个正整数T,接下来有T组数据,每组数据占一行。
每组数据包含两个整数N(来报名的人数,1<=N<=30),M(节目需要的人数0<=M<=30)
每组数据包含两个整数N(来报名的人数,1<=N<=30),M(节目需要的人数0<=M<=30)
Output
每组数据输出一个整数,每个输出占一行
Sample Input
53 25 34 43 68 0
Sample Output
310101
最开始的思路是循环求出 n! 的值,但 30! 是根本不可能求解的,网上有种使用对数缩小阶乘范围,但我感觉可能会有浮点误差,所以我就回到了最初始的想法,既然 int 型能表示组合数,如果我可以模拟手算中的消去相同的因数,这题就应该可以解决!
#include"stdio.h"int main(){int a[100],b[100];int x,y,n; int i,j,k;scanf("%d",&n);while(n--){scanf("%d%d",&x,&y);if(x<y)//特殊情况直接排除,既方便思考,又能提高效率{printf("0\n");continue;}if(y==0){printf("1\n");continue;}for(i=x, k=y ; k>0 ; i--,k--)//模拟分子、分母{a[k] = i;}
for(i=y,k=1 ; i>0 ; i--,k++)b[k] = i;i=1;while(i<=y)//模拟计算{for(j=1 ; j<=y ; j++)if(a[j]%b[i]==0){a[j] = a[j]/b[i];b[i] = 1;break;}i++;} __int64 sum = 1;for(i=1 ; i<=y ; i++){sum = sum*a[i];}for(i=1 ; i<=y ; i++)//这里就写的不完美,因为很有可能在这里溢出,可以在此重复模拟计算,但会会耗费时间if(b[i]!=1)sum =sum/b[i];printf("%I64d\n",sum); }return 0;}
0 0
- hdu 2519 - 求解组合数
- 组合数快速求解
- 组合数求解公式
- HDU 2519 组合数基础
- Lucas求解组合数模板
- HDU-2519 新生晚会 组合数
- HDU 4159 组合数
- hdu 4869 组合数
- HDU 5651组合数
- hdu 5698 组合数
- 变态组合数C(n,m)求解
- 卡特兰数(组合方法求解)
- 求解钱的张数最少组合
- 递归的应用-组合数求解
- 组合数与错排数求解方法探析
- 一种求解组合数的思路
- 组合数处理(逆元求解)
- java 快速求解组合数 lacus算法
- PROCEDURE-12
- HTTP详解(1)-工作原理
- HDU 1014 Uniform Generator 水题
- 掌握shell应用,Linux 任你行走!
- android animation 零碎总结
- hdu 2519 - 求解组合数
- cnetos 6.5 32bit oracle安装
- C# 中的一些 基本语句,循环的格式.1
- PAT B1030
- #sicily#1003.campus
- USB驱动程序之USB设备驱动程序2鼠标用作键盘学习笔记
- 通过设置文件HTTP header来实现下载文件自动重命名
- USACO 3.1 Agri-Net 最短网络 (最小生成树)(改)
- SQL语句优化