#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <memory.h>
#include <math.h>
#include <assert.h>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <cstring>
#include <string>
#include <algorithm>
#include <functional>
#include <vector>
#include <stack>
#include <unordered_map>
#include <list>
#include <time.h>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> Pi;
typedef pair<ll, ll> Pll;
typedef pair<ll, int> Pli;
typedef pair<int, ll> Pil;
typedef pair<double, int> Pdi;
typedef tuple<int, int, int> Ti;
typedef tuple<int, int, ll> Tiil;
typedef tuple<ll, int, int> Tlii;
typedef tuple<ll, ll, int> Tlli;

#define Fi first
#define Se second
#define pb push_back
#define mp make_pair
#define mt make_tuple
#define rep(pos, len) for(int pos=0;pos<len;pos++)
#define repp(pos, len) for(int pos=1;pos<=len;pos++)
#define all(x) x.begin(), x.end()

#define ABS(x) (((x) > 0 ) ? (x) : (-(x)))
#define MAX2(x, y) (((x) > (y)) ? (x) : (y))
#define MIN2(x, y) (((x) < (y)) ? (x) : (y))
#define MAX3(x, y, z) ( (x) > (y)  ? ( (x) > (z) ? (x) : (z)  ) : ( (y) > (z) ? (y) : (z) )  )
#define MIN3(x, y, z) ( (x) < (y)  ? ( (x) < (z) ? (x) : (z)  ) : ( (y) < (z) ? (y) : (z) )  )
#define MID3(val1,val2,val3) MAX2(MIN2(MAX2(val1,val2),val3),MIN2(val1,val2))

#define GET_MACRO(_1,_2,_3,_4,NAME,...) NAME

#define geti1(X) scanf("%d",&X)
#define geti2(X,Y) scanf("%d%d",&X,&Y)
#define geti3(X,Y,Z) scanf("%d%d%d",&X,&Y,&Z)
#define geti4(X,Y,Z,W) scanf("%d%d%d%d",&X,&Y,&Z,&W)
#define geti(...) GET_MACRO(__VA_ARGS__, geti4, geti3, geti2, geti1) (__VA_ARGS__)

#define getll1(X) scanf("%lld",&X)
#define getll2(X,Y) scanf("%lld%lld",&X,&Y)
#define getll3(X,Y,Z) scanf("%lld%lld%lld",&X,&Y,&Z)
#define getll4(X,Y,Z,W) scanf("%lld%lld%lld%lld",&X,&Y,&Z,&W)
#define getll(...) GET_MACRO(__VA_ARGS__, getll4, getll3, getll2, getll1) (__VA_ARGS__)

#define dout(n) printf("%d\n",n)
#define lldout(n) printf("%lld\n",n)

// 1-index
#define L(x) ((x)<<1)
#define R(x) (((x)<<1)+1)

#define INF 987654321
#define IINF 98765432198765432
#define MOD 1000000007

const int MAXN = 1e5 + 50;

ll fact[MAXN], finv[MAXN];	// fact[n] = n!, finv[MAXN] = (n!)^(-1)
bool vis[MAXN];
vector<int> pfactor[MAXN];

ll inverse(ll a, ll m) {
    ll m0 = m, t, q;
    ll x0 = 0, x1 = 1;
 
    if (m == 1)
      return 0;
 
    while (a > 1) {
        // q is quotient
        q = a / m;
        t = m;
 
        // m is remainder now, process same as
        // Euclid's algo
        m = a % m, a = t;
        t = x0;
        x0 = x1 - q * x0;
        x1 = t;
    }
 
    // Make x1 positive
    if (x1 < 0)
       x1 += m0;
    return x1;
}


ll c(int n, int k) {
	return (((fact[n] * finv[k]) % MOD) * finv[n-k]) % MOD;
}



void findPrime() {
	for(int n = 2; n <= 1e5; n++) {
		if(vis[n]) continue;
		vis[n] = true;
		for(int k = 1; k * n <= 1e5; k++) {
			vis[k * n] = true;
			pfactor[k * n].pb(n);
		}
	}
}

void init() {
	fact[0] = 1;
	repp(n, 1e5) fact[n] = (fact[n-1] * n) % MOD;
	finv[0] = 1;
	repp(n, 1e5) finv[n] = inverse(fact[n], MOD);
}

int main() {
	init();
	findPrime();

	int T;
	geti(T);
	while(T--) {
		int n, f;
		geti(n, f);
		ll ans = 0;
		for(int mask = 0; mask < (1 << pfactor[n].size()); mask++) {
			int cnt = 0;
			int tmp = n;
			rep(i, pfactor[n].size()) {
				if((mask >> i) & 1) {
					tmp /= pfactor[n][i];
					cnt++;
				}
			}
			if(cnt & 1) {
				ans = (ans - c(tmp - 1, f - 1) + MOD) % MOD;
			} else {
				ans = (ans + c(tmp - 1, f - 1)) % MOD;
			}
		}

		printf("%lld\n", ans);
	}
}