#include #include #include #include #include #include using namespace std; const int MOD = 1000000007; const int maxn = 500; int frac[maxn + 1], choose[maxn + 1][maxn + 1]; int f[maxn + 1][maxn * maxn / 2 + 1], prefix[maxn + 1][maxn * maxn / 2 + 1]; int main() { frac[0] = 1; for (int i = 1; i <= maxn; ++ i) { frac[i] = (long long)frac[i - 1] * i % MOD; } for (int i = 0; i <= maxn; ++ i) { choose[i][0] = 1; for (int j = 1; j <= maxn; ++ j) { choose[i][j] = (choose[i - 1][j] + choose[i - 1][j - 1]) % MOD; } } for (int i = 1; i <= maxn; ++ i) { int maxi = i * (i - 1) / 2; f[i][0] = 1; for (int j = 1; j <= maxi; ++ j) { int t = f[i][j - 1] + f[i - 1][j]; if (t >= MOD) { t -= MOD; } if (j >= i) { t -= f[i - 1][j - i]; if (t < 0) { t += MOD; } } f[i][j] = t; } } /*for (int i = 0; i <= 10; ++ i) { cout << f[10][i] << " "; } cout << endl; return 0;*/ for (int i = 1; i <= maxn; ++ i) { int maxi = i * (i - 1) / 2; prefix[i][0] = f[i][0]; for (int j = 1; j <= maxi; ++ j) { assert(f[i][j] == f[i][maxi - j]); prefix[i][j] = (prefix[i][j - 1] + f[i][j]) % MOD; } } int T; for (assert(scanf("%d", &T) == 1 && 1 <= T && T <= 10000); T --;) { int n, E; assert(scanf("%d%d", &n, &E) == 2); assert(1 <= n && n <= maxn); assert(0 <= E && E <= 1000000); int sum = 0; for (int x = 1; x <= n; ++ x) { int answer = (long long)choose[n][x] * choose[n][x] % MOD; int maxi = min(E, x * (x - 1) / 2); answer = (long long)answer * prefix[n][maxi] % MOD; answer = (long long)answer * frac[n - x] % MOD; answer = (long long)answer * frac[n - x] % MOD; answer = (long long)answer * (n - x + 1) % MOD; sum += answer; if (sum >= MOD) { sum -= MOD; } } printf("%d\n", sum); } return 0; }