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 }

猜你喜欢

转载自www.cnblogs.com/ttttttttrx/p/10264953.html