#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MOD = 998244353;
const int MAXVAL = 1e12;
int add(int x, int y) {
return (x + y) % MOD;
}
int sub(int x, int y) {
return (x - y + MOD) % MOD;
}
int mul(int x, int y) {
return (x % MOD * y % MOD) % MOD;
}
int n;
int a[200001];
int s[200001], s2[200001];
int rechecker() {
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
int tmp = (a[i] % a[j]) % MOD;
ans = add(ans, mul(tmp, tmp));
}
}
return ans;
}
void solve() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
// Remove zeros and sort
int new_n = 0;
for (int i = 1; i <= n; i++) {
if (a[i] > 0) {
a[++new_n] = a[i];
}
}
n = new_n;
if (n == 0) {
cout << 0 << endl;
return;
}
sort(a + 1, a + n + 1);
// Build prefix sums
for (int i = 1; i <= n; i++) {
s[i] = add(s[i-1], a[i] % MOD);
int tmp = a[i] % MOD;
s2[i] = add(s2[i-1], mul(tmp, tmp));
}
int ans = 0;
for (int i = 1; i <= n; i++) {
// For each a[i], find contribution as divisor
int divisor = a[i];
// Handle different ranges of q where a[j] = q * divisor + r
for (int q = 0; ; q++) {
// Find range [l, r] where q * divisor <= a[j] < (q+1) * divisor
int left_bound = q * divisor;
int right_bound = (q + 1) * divisor;
// Handle overflow check
if (q > 0 && left_bound / q != divisor) break; // overflow
if (right_bound < left_bound) break; // overflow
int l = lower_bound(a + 1, a + n + 1, left_bound) - a;
int r = lower_bound(a + 1, a + n + 1, right_bound) - a - 1;
if (l > n || r < 1 || l > r) {
if (left_bound > a[n]) break;
continue;
}
// Clamp to valid range
l = max(l, 1LL);
r = min(r, n);
if (l > r) continue;
// Calculate contribution for this range
// For a[j] in [l, r]: a[j] % divisor = a[j] - q * divisor
// So (a[j] % divisor)^2 = (a[j] - q * divisor)^2
// = a[j]^2 - 2*q*divisor*a[j] + q^2*divisor^2
int count = r - l + 1;
int sum_range = sub(s[r], s[l-1]);
int sum2_range = sub(s2[r], s2[l-1]);
int term1 = sum2_range;
int term2 = mul(mul(2 * q % MOD, divisor % MOD), sum_range);
int term3 = mul(mul(mul(q % MOD, q % MOD), mul(divisor % MOD, divisor % MOD)), count % MOD);
int contribution = add(sub(term1, term2), term3);
ans = add(ans, contribution);
// Break if we've covered all elements
if (right_bound > a[n]) break;
}
}
cout << ans << endl;
// Uncomment for debugging
// if (n <= 1000) {
// int check = rechecker();
// if (ans != check) {
// cout << "Recheck FAILED! Expected: " << check << ", Got: " << ans << endl;
// } else {
// cout << "Recheck: Passed" << endl;
// }
// }
}
int32_t main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwpjb25zdCBpbnQgTU9EID0gOTk4MjQ0MzUzOwpjb25zdCBpbnQgTUFYVkFMID0gMWUxMjsKCmludCBhZGQoaW50IHgsIGludCB5KSB7CiAgICByZXR1cm4gKHggKyB5KSAlIE1PRDsKfQoKaW50IHN1YihpbnQgeCwgaW50IHkpIHsKICAgIHJldHVybiAoeCAtIHkgKyBNT0QpICUgTU9EOwp9CgppbnQgbXVsKGludCB4LCBpbnQgeSkgewogICAgcmV0dXJuICh4ICUgTU9EICogeSAlIE1PRCkgJSBNT0Q7Cn0KCmludCBuOwppbnQgYVsyMDAwMDFdOwppbnQgc1syMDAwMDFdLCBzMlsyMDAwMDFdOwoKaW50IHJlY2hlY2tlcigpIHsKICAgIGludCBhbnMgPSAwOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbjsgaisrKSB7CiAgICAgICAgICAgIGludCB0bXAgPSAoYVtpXSAlIGFbal0pICUgTU9EOwogICAgICAgICAgICBhbnMgPSBhZGQoYW5zLCBtdWwodG1wLCB0bXApKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gYW5zOwp9Cgp2b2lkIHNvbHZlKCkgewogICAgY2luID4+IG47CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKICAgICAgICBjaW4gPj4gYVtpXTsKICAgIH0KICAgIAogICAgLy8gUmVtb3ZlIHplcm9zIGFuZCBzb3J0CiAgICBpbnQgbmV3X24gPSAwOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgaWYgKGFbaV0gPiAwKSB7CiAgICAgICAgICAgIGFbKytuZXdfbl0gPSBhW2ldOwogICAgICAgIH0KICAgIH0KICAgIG4gPSBuZXdfbjsKICAgIAogICAgaWYgKG4gPT0gMCkgewogICAgICAgIGNvdXQgPDwgMCA8PCBlbmRsOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIAogICAgc29ydChhICsgMSwgYSArIG4gKyAxKTsKICAgIAogICAgLy8gQnVpbGQgcHJlZml4IHN1bXMKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIHNbaV0gPSBhZGQoc1tpLTFdLCBhW2ldICUgTU9EKTsKICAgICAgICBpbnQgdG1wID0gYVtpXSAlIE1PRDsKICAgICAgICBzMltpXSA9IGFkZChzMltpLTFdLCBtdWwodG1wLCB0bXApKTsKICAgIH0KICAgIAogICAgaW50IGFucyA9IDA7CiAgICAKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIC8vIEZvciBlYWNoIGFbaV0sIGZpbmQgY29udHJpYnV0aW9uIGFzIGRpdmlzb3IKICAgICAgICBpbnQgZGl2aXNvciA9IGFbaV07CiAgICAgICAgCiAgICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCByYW5nZXMgb2YgcSB3aGVyZSBhW2pdID0gcSAqIGRpdmlzb3IgKyByCiAgICAgICAgZm9yIChpbnQgcSA9IDA7IDsgcSsrKSB7CiAgICAgICAgICAgIC8vIEZpbmQgcmFuZ2UgW2wsIHJdIHdoZXJlIHEgKiBkaXZpc29yIDw9IGFbal0gPCAocSsxKSAqIGRpdmlzb3IKICAgICAgICAgICAgaW50IGxlZnRfYm91bmQgPSBxICogZGl2aXNvcjsKICAgICAgICAgICAgaW50IHJpZ2h0X2JvdW5kID0gKHEgKyAxKSAqIGRpdmlzb3I7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBIYW5kbGUgb3ZlcmZsb3cgY2hlY2sKICAgICAgICAgICAgaWYgKHEgPiAwICYmIGxlZnRfYm91bmQgLyBxICE9IGRpdmlzb3IpIGJyZWFrOyAvLyBvdmVyZmxvdwogICAgICAgICAgICBpZiAocmlnaHRfYm91bmQgPCBsZWZ0X2JvdW5kKSBicmVhazsgLy8gb3ZlcmZsb3cKICAgICAgICAgICAgCiAgICAgICAgICAgIGludCBsID0gbG93ZXJfYm91bmQoYSArIDEsIGEgKyBuICsgMSwgbGVmdF9ib3VuZCkgLSBhOwogICAgICAgICAgICBpbnQgciA9IGxvd2VyX2JvdW5kKGEgKyAxLCBhICsgbiArIDEsIHJpZ2h0X2JvdW5kKSAtIGEgLSAxOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGwgPiBuIHx8IHIgPCAxIHx8IGwgPiByKSB7CiAgICAgICAgICAgICAgICBpZiAobGVmdF9ib3VuZCA+IGFbbl0pIGJyZWFrOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIENsYW1wIHRvIHZhbGlkIHJhbmdlCiAgICAgICAgICAgIGwgPSBtYXgobCwgMUxMKTsKICAgICAgICAgICAgciA9IG1pbihyLCBuKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChsID4gcikgY29udGludWU7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBDYWxjdWxhdGUgY29udHJpYnV0aW9uIGZvciB0aGlzIHJhbmdlCiAgICAgICAgICAgIC8vIEZvciBhW2pdIGluIFtsLCByXTogYVtqXSAlIGRpdmlzb3IgPSBhW2pdIC0gcSAqIGRpdmlzb3IKICAgICAgICAgICAgLy8gU28gKGFbal0gJSBkaXZpc29yKV4yID0gKGFbal0gLSBxICogZGl2aXNvcileMgogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgID0gYVtqXV4yIC0gMipxKmRpdmlzb3IqYVtqXSArIHFeMipkaXZpc29yXjIKICAgICAgICAgICAgCiAgICAgICAgICAgIGludCBjb3VudCA9IHIgLSBsICsgMTsKICAgICAgICAgICAgaW50IHN1bV9yYW5nZSA9IHN1YihzW3JdLCBzW2wtMV0pOwogICAgICAgICAgICBpbnQgc3VtMl9yYW5nZSA9IHN1YihzMltyXSwgczJbbC0xXSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpbnQgdGVybTEgPSBzdW0yX3JhbmdlOwogICAgICAgICAgICBpbnQgdGVybTIgPSBtdWwobXVsKDIgKiBxICUgTU9ELCBkaXZpc29yICUgTU9EKSwgc3VtX3JhbmdlKTsKICAgICAgICAgICAgaW50IHRlcm0zID0gbXVsKG11bChtdWwocSAlIE1PRCwgcSAlIE1PRCksIG11bChkaXZpc29yICUgTU9ELCBkaXZpc29yICUgTU9EKSksIGNvdW50ICUgTU9EKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGludCBjb250cmlidXRpb24gPSBhZGQoc3ViKHRlcm0xLCB0ZXJtMiksIHRlcm0zKTsKICAgICAgICAgICAgYW5zID0gYWRkKGFucywgY29udHJpYnV0aW9uKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIEJyZWFrIGlmIHdlJ3ZlIGNvdmVyZWQgYWxsIGVsZW1lbnRzCiAgICAgICAgICAgIGlmIChyaWdodF9ib3VuZCA+IGFbbl0pIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIAogICAgY291dCA8PCBhbnMgPDwgZW5kbDsKICAgIAogICAgLy8gVW5jb21tZW50IGZvciBkZWJ1Z2dpbmcKICAgIC8vIGlmIChuIDw9IDEwMDApIHsKICAgIC8vICAgICBpbnQgY2hlY2sgPSByZWNoZWNrZXIoKTsKICAgIC8vICAgICBpZiAoYW5zICE9IGNoZWNrKSB7CiAgICAvLyAgICAgICAgIGNvdXQgPDwgIlJlY2hlY2sgRkFJTEVEISBFeHBlY3RlZDogIiA8PCBjaGVjayA8PCAiLCBHb3Q6ICIgPDwgYW5zIDw8IGVuZGw7CiAgICAvLyAgICAgfSBlbHNlIHsKICAgIC8vICAgICAgICAgY291dCA8PCAiUmVjaGVjazogUGFzc2VkIiA8PCBlbmRsOwogICAgLy8gICAgIH0KICAgIC8vIH0KfQoKaW50MzJfdCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKE5VTEwpOwogICAgCiAgICBpbnQgdDsKICAgIGNpbiA+PiB0OwogICAgd2hpbGUgKHQtLSkgewogICAgICAgIHNvbHZlKCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==