#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int __OneWan_2024 = [](){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
return 0;
}();
void Exgcd(i64 a, i64 b, i64 &x, i64 &y) {
if (b == 0) {
x = 1;
y = 0;
return;
}
Exgcd(b, a % b, y, x);
y -= a / b * x;
}
int inv(int a, int P) {
i64 x, y;
Exgcd(a, P, x, y);
return (x % P + P) % P;
}
struct Node {
int x, y, z;
bool operator<(const Node &node) const {
if (x == node.x) {
if (y == node.y) {
return z < node.z;
}
return y < node.y;
}
return x < node.x;
}
};
map<Node, int> ans[100005];
int n, m;
int solve(int a, int b) {
if (a == 0) return 0;
if (b == 0) return 1;
int d = __gcd(__gcd(a, b), m);
int m1 = m / d;
a /= d;
b /= d;
int p = __gcd(a, m1), q = __gcd(b, m1), m2 = m1 / p / q;
a /= p;
b /= q;
int k = 1LL * a * inv(b, m2) % m2;
if (ans[m1].count({k, q, p})) return ans[m1][{k, q, p}];
return -1;
}
int main() {
cin >> n >> m;
for (int m1 = 2 ; m1 <= m ; m1++) {
if (m % m1 == 0) {
int a = 0, b = 1;
for (int j = 0 ; ; j++) {
if (a && b) {
int p = __gcd(a, m1), q = __gcd(b, m1), m2 = m1 / p / q;
int ta = a / p, tb = b / q;
int k = 1LL * ta * inv(tb, m2) % m2;
if (!ans[m1].count({k, q, p})) {
ans[m1][{k, q, p}] = j;
}
}
int x1 = b;
b = a;
a = (x1 + a) % m1;
if (b == 1 && a == 0) {
break;
}
}
}
}
for (int i = 0 ; i < n ; i++) {
int a, b;
cin >> a >> b;
a %= m;
b = (m - b % m) % m;
cout << solve(a, b) << "\n";
}
return 0;
}