首先显然策略是转着每次选 k 个,考虑 \mathbb E(X)=\sum_k\mathbb P(X>k),而 \mathbb P(X>k) 就是选 k 次还没击中答案的概率。显然位置 i 有宝藏、c 轮过后还没击中的概率是 (\frac12)^{\lfloor\frac{kc-i}n\rfloor+1},那么可以写出答案的表达式:
const int P = 1000000007, I = (P + 1) / 2;
struct info
{
int x, y, ay, ayx, ayy;
info(int a = 0, int b = 0, int c = 0, int d = 0, int e = 0) : x(a), y(b), ay(c), ayx(d), ayy(e){}
info operator * (const info& rhs) const {return info((x + rhs.x) % P, (y + rhs.y) % P, (ay + 1ll * qpow(I, y) * rhs.ay) % P, (ayx + 1ll * qpow(I, y) * (rhs.ayx + 1ll * x * rhs.ay % P)) % P, (ayy + 1ll * qpow(I, y) * (rhs.ayy + 1ll * y * rhs.ay % P)) % P);}
};
Euclid<info> e;
int n, k;
int main()
{
int T; scanf("%d", &T); info U(0, 1, 0, 0, 0), R(1, 0, 1, 1, 0);
while (T--)
{
scanf("%d%d", &n, &k);
info o = e.solve(k, n, 2 * n - k - 1, n, U, R);
int A = 8ll * o.ay % P * n % P, B = 4ll * k * (o.ayx - o.ay) % P, C = 4ll * n * (o.ayy - 2ll * o.ay % P) % P;
int ans = 1ll * ((A - B) % P + C) % P * I % P * qpow(n, P - 2) % P * qpow(1 - qpow(I, k), P - 2) % P;
printf("%d\n", (ans + P) % P);
}
return 0;
}