#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 9;
int cnt[N], prefix[N];
//用cnt[i]表示乘积是i的三角形的三元组有多少个
void dfs(int dep, int st, int mul, int sum)
{
//sum表示前边的边的和
if (mul > 1e6) return;
if (dep == 4)
{
cnt[mul] ++;
return;
}
int up = pow(1e6 / mul, 1.0 / (4 - dep)) + 3;
for (int i = st + 1; i < (dep == 3 ? sum : up); i ++)
{
dfs(dep + 1, i, mul * i, sum + i);
}
}
int main()
{
dfs(1, 0, 1, 0);
for (int i = 1; i <= 1e6; i ++) prefix[i] = prefix[i - 1] + cnt[i];
int q;cin >> q;
while(q --)
{
int l, r; cin >> l >> r;
cout << prefix[r] - prefix[l - 1] << '\n';
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 9;
int n, cnt[N], prefix[N];
//用cnt[i]表示乘积是i的三角形的三元组有多少个
void dfs(int dep, int st, int mul, int sum)
{
//sum表示前边的边的和
//剪枝1
if (mul > 1e5) return;
if (dep == n + 1)
{
cnt[mul] ++;
return;
}
//剪枝2:求上限
int up = pow(1e5 / mul, 1.0 / (n - dep + 1)) + 3;
//剪枝3:求下限构造他是一个递增的
for (int i = st + 1; i < (dep == n ?min(sum, up) : up); i ++)
{
dfs(dep + 1, i, mul * i, sum + i);
}
}
int main()
{
int q; cin >> q >>n;
dfs(1, 0, 1, 0);
for (int i = 1; i <= 1e5; i ++)
prefix[i] = prefix[i - 1] + cnt[i];
while(q --)
{
int l, r; cin >> l >> r;
cout << prefix[r] - prefix[l - 1] << '\n';
}
return 0;
}