#include using namespace std; using int64 = long long; using i128 = __int128_t; // N(10進文字列) % M static int64 mod_decimal_string(const string &s, int64 M) { if (M == 1) return 0; int64 r = 0; for (char c : s) { int d = c - '0'; r = ( (i128)r * 10 + d ) % M; } return r; } // floor(N/2) % M を、N(10進文字列)を筆算しながら求める static int64 half_mod(const string &s, int64 M) { if (M == 1) return 0; int carry = 0; // 0 or 1 (2で割るときの繰り下がり) int64 r = 0; // 商の mod M for (char c : s) { int d = c - '0'; int cur = carry * 10 + d; int qdigit = cur / 2; carry = cur % 2; r = ( (i128)r * 10 + qdigit ) % M; } return r; } // s に +1(破壊的) static void add_one(string &s) { int i = (int)s.size() - 1; while (i >= 0 && s[i] == '9') { s[i] = '0'; --i; } if (i < 0) { s.insert(s.begin(), '1'); } else { s[i] = char(s[i] + 1); } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { string N; int64 M; cin >> N >> M; if (M == 1) { cout << 0 << "\n"; continue; } bool even = ((N.back() - '0') % 2 == 0); int64 n_mod = mod_decimal_string(N, M); int64 ans; if (even) { // (N/2) * (N+1) mod M int64 a = half_mod(N, M); int64 b = (n_mod + 1) % M; ans = (int64)((i128)a * b % M); } else { // N * ((N+1)/2) mod M string Np1 = N; add_one(Np1); // N+1(必ず偶数) int64 b = half_mod(Np1, M); // (N+1)/2 mod M ans = (int64)((i128)n_mod * b % M); } cout << ans << "\n"; } return 0; }