//把n拆分成不同k个数之和 使得k个数乘积最大
//因为C=A+B A+2<=B时,缩小A,B之差,乘积变大<-(A+1)(B-1)=AB+B-A-1>AB
//推出k个数为连续的 或者为连续两段中间差2,构造这k个数即可
#include <iostream>
#include <algorithm>
#include <list>
#include <cstdio>
#include <cstdlib>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N= 1e5+20;
ll ans[N];
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,k;
cin>>n>>k;
//把n拆分成不同k个数之和 使得k个数乘积最大
//因为C=A+B A+2<=B时,缩小A,B之差,乘积变大<-(A+1)(B-1)=AB+B-A-1>AB
//推出k个数为连续的 或者为连续两段中间差2,构造这k个数即可
ll s=k*(k+1)/2;
if(s>n)
{
cout<<-1<<endl;
continue;
}
ll ave=(n-s)/k;//先按1~k排好,不够n每个在加ave
//cout<<ave<<endl;
for(int i=1;i<=k;i++)
{
ans[i]=i+ave;
}
ll last=(n-s)%k;
for(int i=0;i<last;i++)//还有余数,从最后加起 前面加可能由重复
{
ans[k-i]++;
}
ll res=1;
for(int i=1;i<=k;i++)
{
res=(res*ans[i])%mod;
}
cout<<res<<endl;
}
return 0;
}