constint N = 1e5 + 10; constint M = 1e5; const ll mod = (1ll << 31);
int n, m;
structquery { int n, m, k, i; query(int n = 0, int m = 0, int k = 0, int i = 0) : n(n), m(m), k(k), i(i) {} friendbooloperator < (query a, query b) {return a.k < b.k;} };
query q[N];
ll ans[N];
structBIT { ll b[N]; BIT(){memset(b, 0, sizeof(b));} intlowbit(int x){return x & (-x);} voidadd(int x, ll k) { for(int i = x; i <= M; i += lowbit(i)) b[i] = (b[i] + k) % mod; } ll sum(int x) { ll s = 0; for(int i = x; i >= 1; i -= lowbit(i)) s = (s + b[i]) % mod; return s; } ll query(int l, int r) { return (sum(r) - sum(l - 1) + mod) % mod; } };
BIT bit;
int prime[N], cnt, mu[N];
bool vis[N];
structnode { int i, s; friendbooloperator < (node a, node b) {return a.s < b.s;} };
node S[N];
voidinit() { mu[1] = 1; for(int i = 2; i <= M; i++) { if(!vis[i])prime[++cnt] = i, mu[i] = -1; for(int j = 1; j <= cnt && i * prime[j] <= M; j++) { vis[i * prime[j]] = true; if(i % prime[j] == 0)break; mu[i * prime[j]] = -mu[i]; } } for(int i = 1; i <= M; i++) S[i].i = i; for(int i = 1; i <= M; i++) for(int j = i; j <= M; j += i) S[j].s = (S[j].s + i * 1ll) % mod; sort(S + 1, S + M + 1); }
intmain() { init(); int T; scanf("%d", &T); for(int i = 1; i <= T; i++) { int n, m, k; scanf("%d%d%d", &n, &m, &k); q[i] = query(n, m, k, i); } sort(q + 1, q + T + 1); for(int i = 1, j = 1; i <= T; i++) { while(S[j].s <= q[i].k && j < M) { for(int k = S[j].i; k <= M; k += S[j].i) bit.add(k, (S[j].s * mu[k / S[j].i] % mod + mod) % mod); j++; } int n = q[i].n, m = q[i].m, id = q[i].i; for(int l = 1, r; l <= min(n, m); l = r + 1) { r = min(n / (n / l), m / (m / l)); ans[id] = (ans[id] + 1ll * (n / l) * (m / l) % mod * bit.query(l, r) % mod + mod) % mod; } } for(int i = 1; i <= T; i++) printf("%lld\n", ans[i]); return0; }