Paths on a Grid POJ - 1942 組合數學 (組合數的快速計算)
阿新 • • 發佈:2019-01-14
題意:格路問題 沒什麼難度 難點在於如何快速計算相對較大的組合數
思路:運用手寫計算組合數的方式進行計算 如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 returnu(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 }