#include using namespace std; //#include //using namespace atcoder; using ll = long long int; using ull = unsigned long long int; using ld = long double; constexpr ll MAX = 2000000000000000000; constexpr ld PI = 3.14159265358979; constexpr ll MOD = 998244353;//2024948111; ld dotorad(ld K){ return PI * K / 180.0; } ld radtodo(ld K){ return K * 180.0 / PI; } mt19937 mt; void randinit(){ srand((unsigned)time(NULL));mt = mt19937(rand()); } void solve(){ ll N,A; cin >> N >> A; if(A == 1){ ll a = (1 + N - 1) % MOD; ll b = (N - 1) % MOD; if(a % 2 == 0) a /= 2; else b /= 2; ll ans = a * b; ans %= MOD; cout << ans << endl; return; } ll s = 1,last = N,ans = 0; for(ll p = 0;p <= 100;p++){ if(last == 1) break; ll sa; if(MAX / A < s) sa = MAX; else sa = s * A; ll st = (N / (sa)) + 1; //cerr << st << " " << last << endl; if(last == st) break; ll m = 0,cp = N; for(ll i = 0;i < p;i++){ m += cp % A; cp /= A; } ll lst = (last - st); lst %= MOD; ans += (lst * (p % MOD)) % MOD; ans += (lst * (m % MOD)) % MOD; ans %= MOD; ll hiku = N / s; ans += (lst * (hiku % MOD)) % MOD; ans %= MOD; { ll a = (last - st); ll b = (last + st - 1); if(a % 2 == 0) a /= 2; else b /= 2; a %= MOD; b %= MOD; ans -= (a * b) % MOD; } ans %= MOD; if(ans < 0) ans += MOD; // cerr << "ans = " << ans << endl; last = st; if(MAX / A < s) break; s *= A; } cout << ans << endl; } int main(){ ll T; cin >> T; while(T--){ solve(); } }