fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int int64_t
  5. #define endl '\n'
  6. #define vi vector<int>
  7. #define vvi vector<vi>
  8. #define F0(n, i) for(int i = 0; i < n; i++)
  9. #define F1(n, i) for(int i = 1; i <= n; i++)
  10. #define each(a) for(auto& e: a)
  11. #define arr(a) { each(a) cerr << e << ' '; cerr << endl; }
  12.  
  13. const int N = 1e5, M = 1e9 + 7;
  14. vi F(N + 1);
  15.  
  16. int exp(int x, int p) {
  17. int ans = 1;
  18. for(int r = x, b = 0; b < 32; b++, r = (r * r) % M) {
  19. if((1 << b) & p) ans = (ans * r) % M;
  20. }
  21. return ans;
  22. }
  23.  
  24. int imod(int x) {
  25. return exp(x, M - 2);
  26. }
  27.  
  28. int C(int n, int r) {
  29. return (F[n] * imod(F[r]) % M) * imod(F[n - r]) % M;
  30. }
  31.  
  32. void facto() {
  33. F[0] = 1;
  34. F1(N, i) F[i] = (F[i - 1] * i) % M;
  35. }
  36.  
  37. void solve() {
  38. int A, B;
  39. cin >> A >> B;
  40. auto dist = [&](int x1, int y1, int x2, int y2) {
  41. return abs(x1 - x2) + abs(y1 - y2);
  42. };
  43. // cerr << exp(1, 5) << endl;
  44. // cerr << C(6, 3) << endl;
  45. int tot = C(dist(0, 0, A - 1, A - 1), A - 1);
  46. int ways = 0, prev = 0, gap = A / 2 - B;
  47. for(int i = 0; i < gap; i++) {
  48. int j = A - gap;
  49. int x = (C(dist(i, j, 0, 0), i) - prev + M) % M, y = C(dist(i, j, A - 1, A - 1), gap - 1);
  50. cerr << i << ' ' << j << ' ' << x << ' ' << y << endl;
  51. int curr = (x * y + M) % M;
  52. ways = (ways + curr) % M;
  53. cerr << i << ' ' << j << ' ' << curr << endl;
  54. prev += x;
  55. }
  56. cerr << ways << endl;
  57. ways = (ways * 2) % M;
  58. cout << ways;
  59. }
  60.  
  61. int32_t main() {
  62. int t = 1;
  63. facto();
  64. // arr(F);
  65. cin >> t;
  66. while(t--) {
  67. solve();
  68. cout << endl;
  69. }
  70. }
Success #stdin #stdout #stderr 0.01s 5360KB
stdin
7
3 0
5 0
5 1
7 0
7 1
7 2
9 0
stdout
2
34
2
524
74
2
7970
stderr
0 2 1 1
0 2 1
1
0 3 1 5
0 3 5
1 3 3 4
1 3 12
17
0 4 1 1
0 4 1
1
0 4 1 28
0 4 28
1 4 4 21
1 4 84
2 4 10 15
2 4 150
262
0 5 1 7
0 5 7
1 5 5 6
1 5 30
37
0 6 1 1
0 6 1
1
0 5 1 165
0 5 165
1 5 5 120
1 5 600
2 5 15 84
2 5 1260
3 5 35 56
3 5 1960
3985