HDU2519组合数快速算法
#define DeBUG #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <string> #include <set> #include <sstream> #include <map> #include <bitset> using namespace std ; #define zero {0} #define INF 2000000000 #define EPS 1e-6 typedef long long LL; const double PI = acos(-1.0); inline int sgn(double x){return fabs(x) < EPS ? 0 :(x < 0 ? -1 : 1);} unsigned __int64 N(unsigned __int64 n) { if(n==0) return 1; return N(n-1)*n; } double C(int n,int m) { if(m>n) return 0; if(m<n/2.0) m=n-m; double s1=0; for(int i=m+1;i<=n;i++) { s1+=log((double)i); } double s2=0; int ub=n-m; for(int i=2;i<=ub;i++) { s2+=log((double)i); } if(m>n) return 0; return exp(s1-s2); } int main() { #ifdef DeBUGs freopen("C:\\Users\\Sky\\Desktop\\1.in","r",stdin); #endif int T; scanf("%d", &T); while(T--) { unsigned __int64 n,m; cin>>n>>m; if(m>n) printf("0\n"); else printf("%.0lf\n", C(n,m)); } return 0; }