#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int maxn=2*1e6+5;
const int maxm=1e6+5;
ll fact[maxn],f[maxn],inv[maxn];
bool check[maxm];
int mu[maxm],prime[maxm],y[505],cnt,tot;
void init()
{
fact[0]=f[0]=inv[1]=inv[0]=1;
for(int i=2;i<maxn;++i)
inv[i]=inv[mod%i]*(mod-mod/i)%mod;
for(int i=1;i<maxn;++i)
{
fact[i]=fact[i-1]*i%mod;
f[i]=f[i-1]*inv[i]%mod;
}
inv[0]=0;
for(int i=2;i<maxm;i++)
inv[i]=(inv[i-1]+inv[i-2])%(mod-1);
memset(check,false,sizeof(check));
mu[1]=1;
for(int i=2;i<=maxm;i++)
{
if(!check[i])
{
prime[tot++]=i;
mu[i]=-1;
}
for(int j=0;j<tot;j++)
{
if(i*prime[j]>maxm)
break;
check[i*prime[j]]=true;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
mu[i*prime[j]]=-mu[i];
}
}
}
ll solve(int n,int m)
{
if(n<m||n<0||m<0)
return 0;
return fact[n]*f[m]%mod*f[n-m]%mod;
}
void del(int n)
{
cnt=0;
int i;
for(i=1;i*i<n;++i)
if(n%i==0)
{
y[cnt++]=i;
y[cnt++]=n/i;
}
if(i*i==n)
y[cnt++]=i;
sort(y,y+cnt);
}
ll quick_mod(ll n,ll m)
{
ll res=1;
while(m)
{
if(m&1)
res=res*n%mod;
n=n*n%mod;
m>>=1;
}
return res;
}
int main()
{
init();
int t,n,m;
ll ans=0;
scanf("%d",&t);
while(t--&&scanf("%d%d",&n,&m)!=EOF)
{
del(n);
ans=0;
for(int i=0;i<cnt;i++)
{
ll sum=0;
for(int j=i;j<cnt;j++)
if(y[j]%y[i]==0)
sum=(sum+solve(n/y[j]+m-1,n/y[j])*mu[y[j]/y[i]])%mod;
ans=(ans+((quick_mod(2,inv[y[i]]+mod-1)-1)%mod+mod)%mod*sum%mod)%mod;
}
printf("%lld\n",ans*fact[n]%mod*fact[m-1]%mod*f[n+m-1]%mod);
}
return 0;
}