#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#define maxn 2010
#ifdef WIN32
#define PLL "%I64d"
#else
#define PLL "%lld"
#endif
using namespace std;
int T;
struct node{
int n,k;
}a[maxn];
bool flag=1,vis[1000010];
int p[80000],cnt,mx;
long long sum[80000];
void prepare(){
for(int i=2;i<=mx;i++){
if(!vis[i])vis[i]=1,p[++cnt]=i;
for(int j=1;j<=cnt&&i*p[j]<=mx;j++){
vis[i*p[j]]=1;
if(i%p[j]==0)break;
}
}
for(int i=1;i<=cnt;i++)sum[i]=sum[i-1]+p[i];
}
int find(int x){//寻找不超过x的最大的数的位置
int l=1,r=cnt,res=-1;
while(l<=r){
int mid=(l+r)>>1;
if(p[mid]<=x)res=mid,l=mid+1;
else r=mid-1;
}
return res;
}
int find2(int l,int r,int x,int k){//寻找结尾为l~r的,区间长度为k的,不超过x的最大的数的结尾位置
int res=-1;
while(l<=r){
int mid=(l+r)>>1;
if(sum[mid]-sum[mid-k]<=(long long)x)res=mid,l=mid+1;
else r=mid-1;
}
return res;
}
int main(){
freopen("diary.in","r",stdin);freopen("diary.out","w",stdout);
// freopen("Cola.txt","r",stdin);
scanf("%d",&T);
for(int i=1;i<=T;i++){
scanf("%d%d",&a[i].n,&a[i].k);
if(i!=1&&a[i].n!=a[i-1].n)flag=0;
mx=max(mx,a[i].n);
}
prepare();
if(flag){
int pos=find(a[1].n);//寻找小于等于n的最大的数
if(pos==-1){
for(int i=1;i<=T;i++)puts("-1");
return 0;
}
for(int i=1;i<=T;i++){
if(a[i].k>pos||sum[a[i].k]>a[i].n){puts("-1");continue;}
int posnow=find2(a[i].k,pos,a[i].n,a[i].k);
if(posnow==-1){puts("-1");continue;}
long long now=sum[posnow]-sum[posnow-a[i].k];
printf(PLL"
",now);
}
return 0;
}
for(int i=1;i<=T;i++){
int pos=find(a[i].n);
if(pos==-1){puts("-1");continue;}
if(a[i].k>pos||sum[a[i].k]>a[i].n){puts("-1");continue;}
int posnow=find2(a[i].k,pos,a[i].n,a[i].k);
if(posnow==-1){puts("-1");continue;}
long long now=sum[posnow]-sum[posnow-a[i].k];
printf(PLL"
",now);
}
return 0;
}