#include #include using namespace atcoder; #define rep(i, n) for (int i = 0; i < (n); ++i) using namespace std; using mint = modint998244353; vector isp; vector ps, pf, mu; const int MX = 1000005; mint h[11][MX]; mint s[11][MX]; mint pk[11][MX]; void sieve(int mx) { isp.resize(mx+1); pf.resize(mx+1); mu.resize(mx+1); mu[1] = 1; for (int k = 1; k <= 10; ++k) { h[k][1] = 1; } rep(i, mx+1) pf[i] = i; for (int i = 2; i <= mx; ++i) { if (pf[i] == i) { isp[i] = true; ps.push_back(i); mu[i] = -1; for (int k = 1; k <= 10; ++k) { mint p = mint(i).pow(k); pk[k][i] = p; h[k][i] = p-1; } } rep(j, ps.size()) { int p = ps[j]; int x = p * i; if (x > mx) break; pf[x] = p; if (i%p == 0) { mu[x] = 0; for (int k = 1; k <= 10; ++k) { h[k][x] = h[k][i] * pk[k][p]; } break; } mu[x] = -mu[i]; for (int k = 1; k <= 10; ++k) { h[k][x] = h[k][i] * h[k][p]; } } } for (int k = 1; k <= 10; ++k) { for (int i = 1; i <= mx; ++i) { s[k][i] = s[k][i-1] + h[k][i]; } } } void solve() { int n, m, k; cin >> n >> m >> k; mint ans; for (int l = 1, r; l <= m; l = r+1) { int v = m/l; r = m/v; ans += (s[k][r]-s[k][l-1])*mint(v).pow(n); } cout << ans.val() << '\n'; } int main() { sieve(1e6); int t; cin >> t; while (t--) solve(); return 0; }