#include using ll = std::int64_t; std::tuple extgcd(ll a, ll b){ ll s1 = 1, t1 = 0, s2 = 0, t2 = 1; while(b != 0){ std::tie(s1, t1, s2, t2) = std::make_tuple(s2, t2, s1 - (a / b) * s2, t1 - (a / b) * t2); std::tie(a, b) = std::make_tuple(b, a % b); } return std::make_tuple(s1, t1, a); } ll inv(ll a, ll n){ ll inv_a; std::tie(inv_a, std::ignore, std::ignore) = extgcd(a, n); inv_a %= n; if(inv_a < 0){inv_a += n;} return inv_a; } int main(){ std::cin.tie(nullptr); std::ios::sync_with_stdio(false); const int MAX = 100'000; std::vector primes, spf(MAX + 1, 0); for(int i=2;i<=MAX;i++){ if(spf[i] == 0){ primes.emplace_back(i); spf[i] = i; } for(auto &p : primes){ if(p > spf[i] || i > MAX / p){break;} spf[i * p] = p; } } const int MAX2 = 2'000'000; const int MOD = 998244353; std::vector fact(MAX2 + 1, 0), invFact(MAX2 + 1, 0); fact[0] = 1; for(int i=1;i<=MAX2;i++){ fact[i] = fact[i - 1] * i % MOD; } invFact[MAX2] = inv(fact[MAX2], MOD); for(int i=MAX2;i>=1;i--){ invFact[i - 1] = invFact[i] * i % MOD; } int Q; std::cin >> Q; int count = 0; for(int i=0;i> A >> B; while(A > 1){ int p = spf[A]; while(A % p == 0){ count += 1; A /= p; } } // (count - 1) choose (B - 1) ll res = 0; if(count - 1 >= B - 1){ res = fact[count - 1] * invFact[B - 1] % MOD * invFact[count - B] % MOD; } std::cout << res << std::endl; } }