题目很简单,就是给你一个n*m的矩阵,让你求从左下角到右上角的所有路径,简单的组合数学,直接求C(n+m,m)=C(n+m,n)就可以了,只不过,在数据范围上有些需要注意的,如果直接用int型会数据溢出,所以用long long和double型的。
提交的时候,TLE了好几次,不知道哪地方错的,后来又把原代码提交了一遍,竟然A了,而且只用了16ms,不知道是不是poj后台有问题。
代码:
#include <stdio.h> /*double f(double n,double m) { int i,j,s; if(m>n-m) m=n-m; j=1;s=1; for(i=n-m+1;i<=n;i++) { s*=i; while(j<=m&&s%j==0) { s/=j; j++; } } return (double)s; }*/ int main() { double n,m,x,s; long long i; while(scanf("%lf%lf",&n,&m)!=EOF) { if(n==0.0&&m==0.0) break; s=1; if(n!=0&&m!=0) { x=n>m?n:m; for(i=x+1;i<=n+m;i++) { s=s*i/(i-x); } } printf("%.0lf\n",s); } return 0; }