#include <iostream>
using namespace std;
const int MAXM = 15;
int A[MAXM], B[MAXM];
int gcd(int a, int b)
{
if (!b)
return a;
else
return gcd(b, a % b);
}
void exgcd(int a, int b, int& x, int& y)
{
if (!b)
{
x = 1;
y = 0;
}
else
{
exgcd(b, a % b, y, x);
y -= a / b * x;
}
}
int inv(int a, int b)
{
int x = 0, y = 0;
exgcd(a, b, x, y);
x = (x % b + b) % b;
if (!x)
x += b;
return x;
}
int main()
{
int T;
cin >> T;
while (T--)
{
int N, M;
cin >> N >> M;
bool flag = true;
for (int i = 1; i <= M; i++)
cin >> A[i];
for (int i = 1; i <= M; i++)
{
cin >> B[i];
B[i] %= A[i];
}
int m1, m2, c1, c2, t, ans;
for (int i = 2; i <= M; i++)
{
m1 = A[i - 1]; m2 = A[i]; c1 = B[i - 1]; c2 = B[i];
t = gcd(m1, m2);
if ((c2 - c1) % t != 0)
{
flag = false;
break;
}
A[i] = m1 * m2 / t;
B[i] = ((inv(m1 / t, m2 / t) * ((c2 - c1) / t) % (m2 / t) * m1 + c1) % A[i] + A[i]) % A[i];
}
if (!flag)
cout << 0 << endl;
else
{
if (N < B[M])
{
cout << 0 << endl;
continue;
}
ans = (N - B[M]) / A[M] + 1;
if (!B[M])
--ans;
cout << ans << endl;
}
}
return 0;
}