[HDOJ6114] Chess(组合数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6114

其实就是n*m的格子里放棋子,当前层的棋子必须在上一层的右边,问多少种放法。

其实就是求组合数,注意n m大小。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 typedef long long LL;
 5 const LL mod = 1e9+7;
 6 const int maxn = 110000;
 7 int n, m;
 8 LL f[maxn];
 9 
10 void init() {
11   f[0] = f[1] = 1;
12   for(int i = 2; i < maxn; i++) f[i] = (f[i-1] * i) % mod;
13 }
14 
15 LL mul(LL x, LL n) {
16   LL ret = 1;
17   while(n) {
18     if(n & 1) ret = (ret * x) % mod;
19     n >>= 1;
20     x = (x * x) % mod;
21   }
22   return ret;
23 }
24 LL exgcd(LL a, LL b, LL &x, LL &y) {
25   if(b == 0) {
26     x = 1;
27     y = 0;
28     return a;
29   }
30   else {
31     LL ret = exgcd(b, a%b, x, y);
32     LL tmp = x;
33     x = y;
34     y = tmp - a / b * y;
35     return ret;
36   }
37 }
38 LL inv(LL a) {
39   LL x, y;
40   exgcd(a, mod, x, y);
41   return (x % mod + mod) % mod;
42 }
43 LL C(LL x, LL y) {
44   return f[x] * inv(f[x-y]) % mod * inv(f[y]) % mod;
45 }
46 
47 signed main() {
48     // freopen("in", "r", stdin);
49     init();
50     int T;
51     scanf("%d", &T);
52     while(T--) {
53         scanf("%d%d",&n,&m);
54         if(n == m) {
55             printf("1
");
56             continue;
57         }
58         if(n > m) swap(n, m);
59         printf("%I64d
", C(m,n));
60     }
61     return 0;
62 }