1. 程式人生 > >Paths on a Grid POJ - 1942 組合數學 (組合數的快速計算)

Paths on a Grid POJ - 1942 組合數學 (組合數的快速計算)

題意:格路問題 沒什麼難度 難點在於如何快速計算相對較大的組合數

思路:運用手寫計算組合數的方式進行計算  如c(8,3) 如果手算就是   8*7*6/(3*2*1)這樣可以很快得解出

計算程式碼為:(精度沒問題? 反正能過)

 1 u c(u n,u m){
 2     u a=n+m;
 3     u b=min(n,m);
 4     double ans=1;
 5     while(b>0){
 6         ans*=(1.0*a--)/(1.0*b--);
 7     }
 8     ans+=0.5;//四捨五入
 9     return
u(ans); 10 }

AC程式碼:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<cmath>
 6 using namespace std;
 7 const int maxn=10000;
 8 typedef unsigned u;
 9 u c(u n,u m){
10     u a=n+m;
11     u b=min(n,m);
12     double ans=1
; 13 while(b>0){ 14 ans*=(1.0*a--)/(1.0*b--); 15 } 16 ans+=0.5; 17 return u(ans); 18 } 19 int main(){ 20 21 u a,b; 22 while(scanf("%u%u",&a,&b)==2){ 23 if(!a&&!b)break; 24 printf("%u\n",c(a,b)); 25 } 26 return 0; 27 }