(组合数取模, 数论)2017"百度之星"程序设计大赛

来源:互联网 发布:信义安所见乎翻译 编辑:程序博客网 时间:2024/06/05 04:45

2017”百度之星”程序设计大赛 - 初赛(B) 1001 Chess

思路

  • 结果就是 C(MAX, MIN) % mod, MAX为n, m中的较大值, MIN为n, m中较小值.
  • 其中要做的就是组合数取模, 见文章组合数取模

代码:

#include <bits/stdc++.h>using namespace std;#define LL long longconst LL p = 1e9+7;const int SIZE = 1e3+5;LL n, m;LL quick_mod(LL a, LL b)  {      LL ans = 1;      a %= p;      while(b)      {          if(b & 1)          {              ans = ans * a % p;              b--;          }          b >>= 1;          a = a * a % p;      }      return ans;  }  LL C(LL n, LL m)  {      if(m > n) return 0;      LL ans = 1;      for(int i=1; i<=m; i++)      {          LL a = (n + i - m) % p;          LL b = i % p;          ans = ans * (a * quick_mod(b, p-2) % p) % p;      }      return ans;  }  LL Lucas(LL n, LL m)  {      if(m == 0) return 1;      return C(n % p, m % p) * Lucas(n / p, m / p) % p;  }  int main(int argc, char const *argv[]){    int t;    scanf("%d", &t);    while (t--)    {        scanf("%I64d %I64d", &n, &m);        LL MAX = max(n, m);        LL MIN = min(min(n, m), MAX-min(n, m));        printf("%I64d\n", Lucas(MAX, MIN));     }    return 0;}
原创粉丝点击