【POJ 2249】 Binomial Showdown 組合數學 排列組合計算
組合(combination),數學的重要概念之一。從n個不同元素中每次取出m個不同元素(0≤m≤n),不管其順序合成一組,稱為從n個元素中不重複地選取m個元素的一個組合。所有這樣的組合的總數稱為組合數,這個組合數的計算公式為
或者
簡單的說就是從n個數中每次取m個元素,一共有多少種不同的取法。
tips:如果用第一個公式計算組合時,可能因為階乘過大而導致乘法溢位。所以我們選用第二個公式來計算。在進行分子乘法的同時,與分母約分,因為組合數是個整數,所以當分母不為1時,gcd(分子的某一項,分母的某一項)!=1,所以將分子和分母的對應項同時除以gcd,只至分母為1。
POJ2249題目大意:從n個數中取m個不同的元素,一共用多少種取法,很明顯就是一個組合數。下面給出程式碼
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=2000+7;
int p[maxn]; //分子
int q[maxn]; //分母
int gcd(int a,int b)
{
int c;
while(b){ //gcd(a,b)=gcd(b,a%b) gcd(a,0)=a; 輾轉相除法的兩個核心公式
c=b;
b=a%b;
a=c;
}
return a;
}
int main()
{
int m,n;
while(scanf("%d %d",&n,&m)==2&&(m||n)){
if(n==0)printf("1\n");
else {
if(m>n-m) m=n-m;
int temp=n;
for(int i=1;i<=m;i++){
p[i]=temp--;
q[i]=i;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
int temp=gcd(p[i],q[j]);
if(temp!=1){
p[i]=p[i]/temp;
q[j]=q[j]/temp;
}
if(p[i]==1)break; //當分子的某一項已經為1 即不能再約分
}
}
int ans=1;
for(int i=1;i<=m;i++)
ans=ans*p[i];
printf("%d\n",ans);
}
}
return 0;
}
相關文章
- 【數學】組合數學 - 排列組合
- 組合數學筆記-排列與組合筆記
- 楊輝三角(組合數)+排列組合
- 排列組合
- js運算元組中資料排列組合JS
- lgB3717 計算組合數
- 組合數學
- 字串排列組合問題字串
- lg組合計數
- 洛谷P2606 [ZJOI2010]排列計數(組合數 dp)
- 《小 學 組 合 數 學》
- acm-排列組合學習筆記(更新中)ACM筆記
- 無重複字串的排列組合字串
- 20240820:組合計數(2)
- 組合數學筆記-特殊計數數列筆記
- 【組合數學】組合數學簡介 ( 組合思想 2 : 數學歸納法 | 數學歸納法推廣 | 多重歸納思想 )
- 【數學】組合數學 - 卡特蘭數
- 常見規格排列組合問題
- 不學無數——組合模式模式
- 2024.4.6 組合數學補題
- 組合數學 XKerror 筆記Error筆記
- 組合計數思維題
- 組合數學學習筆記筆記
- 【學習筆記】組合數學筆記
- 遞迴示例-指定數字以內的所有排列組合(Reduce)遞迴
- 【演算法學習】組合數學演算法
- 組合數學水題 $19$ 道
- Redux實現組合計數器Redux
- 組合數問題
- 組合數字首和
- 機器學習之特徵組合:組合獨熱向量機器學習特徵
- python:用pyinstaller做個排列組合的小工具Python
- 遞迴演算法實踐---實現排列組合遞迴演算法
- 回溯問題Python框架總結——排列組合問題Python框架
- 組合數的逆元求法
- Python計算組合數生成楊輝三角形Python
- 組合
- P3974 [TJOI2015]組合數學