Problem:
Score : 700 points

Problem Statement

We have an integer sequence of length N: A_0,A_1,\cdots,A_{N-1}.

Find the following sum (\mathrm{lcm}(a, b) denotes the least common multiple of a and b):

\sum_{i=0}^{N-2} \sum_{j=i+1}^{N-1} \mathrm{lcm}(A_i,A_j)

Since the answer may be enormous, compute it modulo 998244353.

Constraints

1 \leq N \leq 200000

1 \leq A_i \leq 1000000

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_0\ A_1\ \cdots\ A_{N-1}

Output

Print the sum modulo 998244353.

Sample Input 1

3
2 4 6

Sample Output 1

22

\mathrm{lcm}(2,4)+\mathrm{lcm}(2,6)+\mathrm{lcm}(4,6)=4+6+12=22.

Sample Input 2

8
1 2 3 4 6 8 12 12

Sample Output 2

313

Sample Input 3

10
356822 296174 484500 710640 518322 888250 259161 609120 592348 713644

Sample Output 3

353891724

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 1e6 + 5;
const ll mod = 998244353;
ll sum[N];
ll sqsum[N];
ll f[N];
ll inv[N];

ll add(ll x, ll y) {
  x = (x + y);
  if(x >= mod) x -= mod;
  return x;
}

ll sub(ll x, ll y) {
  x = x - y;
  x %= mod;
  if(x < 0) x += mod;
  return x;
}

ll mult(ll x, ll y) {
  x = (x * y) % mod;
  if(x < 0) x += mod;
  return x;
}

ll get(int x) {
  return sub(mult(sum[x], sum[x]), sqsum[x]);
}

int main() {
  inv[1] = 1;
  for(ll i = 2; i < N; i++) {
    inv[i] = add(inv[i], mult(-(mod / i), inv[mod % i]));
  }
  int n; scanf("%d", &n);
  for(int i = 0; i < n; i++) {
    ll x;
    scanf("%lld", &x);
    sum[x] = add(sum[x], x);
    sqsum[x] = add(sqsum[x], mult(x, x));
    //cout << sum[x] << ' ' << sqsum[x] << '\n';
  }
  for(int i = 1; i < N; i++) {
    for(int j = i + i; j < N; j += i) {
      sum[i] = add(sum[i], sum[j]);
      sqsum[i] = add(sqsum[i], sqsum[j]);
    }
    f[i] = get(i);
  }
  ll sum = 0;
  for(int i = N - 1; i >= 1; i--) {
    for(int j = i + i; j < N; j += i) {
      f[i] = sub(f[i], f[j]);
    }
    sum = add(sum, mult(f[i], inv[i]));
  }
  sum = mult(sum, inv[2]);
  printf("%lld\n", sum);
}