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 }