#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

const int mod = 1e9+7, maxn = 2e5+5;
int add(int a, int b) { return (a + b) % mod; }
int mul(int a, int b) { return (a * 1ll * b) % mod; }
void upd(int &a, int b) { a = (a + b) % mod; }
int pwr(int a, int b)
{
    if (!b) return 1;
    int h = pwr(a, b>>1);
    h = mul(h, h);
    if (b&1) h = mul(h, a);
    return h;
}
vector<int> f(maxn, 1), invf(maxn, 1);
int c(int n, int k)
{
  if (n < 0 || k < 0 || n < k) return 0;
  return mul(f[n], mul(invf[k], invf[n - k]));
}
int prod(int l, int r) // vynasobi inverzne prvky cisel v intervale l az r vratane
{
  return mul(invf[r], f[l - 1]);
}
int main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);
  for (int i = 1; i < maxn; i++) f[i] = mul(f[i-1], i), invf[i] = pwr(f[i], mod - 2);
  int t;
  cin >> t;
  while (t--)
  {
    int n, k;
    cin >> n >> k;
    int ans = 0;
    for (int p = 0; p < n; p++) // kolko operacii sme zatial urobili
    {
      if (n - k * (p - 1) < 0) break;
      int ok = c(n - (k - 1) * (p - 1), p); // rozdelime n-(k - 1)*(p-1)-p zhasnutych svetiel do p + 1 skupin
      int ways = mul(f[p], prod(n - p + 1, n));
      upd(ans, mul(ok, ways));
    }
    cout << ans << "\n";
  }
  return 0;
}