MOD = 998244353 # 階乗とその逆元 factorials = [None] * (2 * 10**6 + 1) factorials[0], factorials[1] = 1, 1 inv = [None] * (2 * 10**6 + 1) inv[1] = 1 inv_factorials = [None] * (2 * 10**6 + 1) inv_factorials[0], inv_factorials[1] = 1, 1 for i in range(2, 2 * 10**6 + 1): factorials[i] = factorials[i - 1] * i % MOD inv[i] = -inv[MOD % i] * (MOD // i) % MOD inv_factorials[i] = inv_factorials[i - 1] * inv[i] % MOD # 二項係数 def comb(n, r): if n < r: return 0 return factorials[n] * inv_factorials[r] % MOD * inv_factorials[n - r] % MOD # エラトステネスの篩 def sieve(n): is_prime = [True] * (n + 1) is_prime[0] = is_prime[1] = False for i in range(2, int(n**0.5) + 1): if not is_prime[i]: continue for j in range(i**2, n + 1, i): is_prime[j] = False return [p for p, flg in enumerate(is_prime) if flg] primes = sieve(10**5) # 素因数の個数 def factor_count(n): count = 0 p = 2 for p in primes: while n % p == 0: count += 1 n //= p if p**2 > n: break if n > 1: count += 1 return count Q = int(input()) cnt = 0 for _ in range(Q): A, B = map(int, input().split()) cnt += factor_count(A) ans = comb(cnt - 1, B - 1) print(ans)