Problem p02905 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using uint = unsigned int;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using ull = unsigned long long;
using ld = long double;
template <typename T> void _(const char *s, T h) {
  cerr << s << " = " << h << "\n";
}
template <typename T, typename... Ts> void _(const char *s, T h, Ts... t) {
  int b = 0;
  while (((b += *s == '(') -= *s == ')') != 0 || *s != ',')
    cerr << *s++;
  cerr << " = " << h << ",";
  _(s + 1, t...);
} // break continue pop_back 998244353
#define int ll
#define pii pll
#define f first
#define s second
#define pb emplace_back
#define forn(i, n) for (int i = 0; i < (n); ++i)
#define sz(a) ((int)(a).size())
#define sqr(x) ((x) * (x))
struct init {
  init() {
    cin.tie(0);
    iostream::sync_with_stdio(0);
    cout << fixed << setprecision(10);
    cerr << fixed << setprecision(5);
  }
  ~init() {
#ifdef LOCAL
#define dbg(...) _(#__VA_ARGS__, __VA_ARGS__)
    cerr << "Time elapsed: " << (double)clock() / CLOCKS_PER_SEC << "s.\n";
#else
#define dbg(...)
#endif
  }
} init;
template <typename T, typename U> void upx(T &x, U y) {
  if (x < y)
    x = y;
}
template <typename T, typename U> void upn(T &x, U y) {
  if (x > y)
    x = y;
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int D = 4, dx[] = {+1, 0, -1, 0}, dy[] = {0, +1, 0, -1};
const int N = 1e5 + 5;
const int32_t M = 998244353;
int32_t rev(int32_t x, int32_t m) {
  if (x == 1)
    return 1;
  return (1 - (ll)rev(m % x, x) * m) / x + m;
}
struct mint {
  int32_t x;
  mint() : x(0) {}
  mint(int32_t xx) : x(xx % M) {
    if (x < 0)
      x += M;
  }
  mint(ll xx) : x(xx % M) {
    if (x < 0)
      x += M;
  }
  mint &operator+=(mint b) {
    if ((x += b.x) >= M)
      x -= M;
    return *this;
  }
  mint operator+(mint b) {
    mint res = *this;
    res += b;
    return res;
  }
  mint &operator-=(mint b) {
    if ((x -= b.x) < 0)
      x += M;
    return *this;
  }
  mint operator-(mint b) {
    mint res = *this;
    res -= b;
    return res;
  }
  mint &operator*=(mint b) {
    x = (ll)x * b.x % M;
    return *this;
  }
  mint operator*(mint b) {
    mint res = *this;
    res *= b;
    return res;
  }
  mint inverse() { return rev(x, M); }
  mint &operator/=(mint b) {
    x = (ll)x * rev(b.x, M) % M;
    return *this;
  }
  mint operator/(mint b) {
    mint res = *this;
    res /= b;
    return res;
  }
  mint operator^(ll w) {
    mint r = 1, a = *this;
    while (w) {
      if (w & 1)
        r *= a;
      a *= a;
      w /= 2;
    }
    return r;
  }
  mint operator^=(ll w) { return *this = (*this) ^ w; }
  mint operator^(mint w) { return *this ^ w.x; }
  mint operator^=(mint w) { return *this = (*this) ^ w; }
  mint operator-() const { return mint() - *this; }
  explicit operator bool() const { return x; }
};
istream &operator>>(istream &is, mint &p) {
  istream &res = is >> p.x;
  p.x %= M;
  return res;
}
ostream &operator<<(ostream &os, mint p) { return os << p.x; }
template <typename T> mint operator+(T x, mint y) { return mint(x) + y; }
template <typename T> mint operator-(T x, mint y) { return mint(x) - y; }
template <typename T> mint operator*(T x, mint y) { return mint(x) * y; }
template <typename T> mint operator/(T x, mint y) { return mint(x) / y; }
template <typename T> mint operator^(T x, mint y) { return mint(x) ^ y; }
int a[N];
const int C = 1e6 + 1;
mint c[C], kek[C];
int lp[C], pr[C], cpr = 0, pw[C];
mint g[C];
int32_t main() {
  int n;
  cin >> n;
  forn(i, n) {
    cin >> a[i];
    c[a[i]] += a[i];
  }
  for (int i = 1; i < C; ++i)
    for (int j = i; j < C; j += i)
      kek[i] += c[j];
  for (int i = 2; i < C; ++i) {
    if (!lp[i]) {
      pr[cpr++] = lp[i] = i;
      pw[i] = 1;
    }
    for (int j = 0; j < cpr && pr[j] <= lp[i] && i * pr[j] < C; ++j)
      lp[i * pr[j]] = pr[j];
    if (pw[i] && i * lp[i] < C)
      pw[i * lp[i]] = pw[i] + 1;
  }
  g[1] = 1;
  for (int i = 2; i < C; ++i) {
    if (pw[i]) {
      g[i] = (mint(1) - lp[i]) / i;
    } else {
      int x = 1, y = i, p = lp[i];
      while (lp[y] == p)
        x *= p, y /= p;
      g[i] = g[x] * g[y];
    }
  }
  mint ans = 0;
  for (int i = 1; i < C; ++i) {
    ans += (g[i] * kek[i]) * kek[i];
  }
  forn(i, n) ans -= a[i];
  ans /= 2;
  cout << ans << '\n';

  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using uint = unsigned int;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using ull = unsigned long long;
using ld = long double;
template <typename T> void _(const char *s, T h) {
  cerr << s << " = " << h << "\n";
}
template <typename T, typename... Ts> void _(const char *s, T h, Ts... t) {
  int b = 0;
  while (((b += *s == '(') -= *s == ')') != 0 || *s != ',')
    cerr << *s++;
  cerr << " = " << h << ",";
  _(s + 1, t...);
} // break continue pop_back 998244353
#define int ll
#define pii pll
#define f first
#define s second
#define pb emplace_back
#define forn(i, n) for (int i = 0; i < (n); ++i)
#define sz(a) ((int)(a).size())
#define sqr(x) ((x) * (x))
struct init {
  init() {
    cin.tie(0);
    iostream::sync_with_stdio(0);
    cout << fixed << setprecision(10);
    cerr << fixed << setprecision(5);
  }
  ~init() {
#ifdef LOCAL
#define dbg(...) _(#__VA_ARGS__, __VA_ARGS__)
    cerr << "Time elapsed: " << (double)clock() / CLOCKS_PER_SEC << "s.\n";
#else
#define dbg(...)
#endif
  }
} init;
template <typename T, typename U> void upx(T &x, U y) {
  if (x < y)
    x = y;
}
template <typename T, typename U> void upn(T &x, U y) {
  if (x > y)
    x = y;
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int D = 4, dx[] = {+1, 0, -1, 0}, dy[] = {0, +1, 0, -1};
const int N = 2e5 + 5;
const int32_t M = 998244353;
int32_t rev(int32_t x, int32_t m) {
  if (x == 1)
    return 1;
  return (1 - (ll)rev(m % x, x) * m) / x + m;
}
struct mint {
  int32_t x;
  mint() : x(0) {}
  mint(int32_t xx) : x(xx % M) {
    if (x < 0)
      x += M;
  }
  mint(ll xx) : x(xx % M) {
    if (x < 0)
      x += M;
  }
  mint &operator+=(mint b) {
    if ((x += b.x) >= M)
      x -= M;
    return *this;
  }
  mint operator+(mint b) {
    mint res = *this;
    res += b;
    return res;
  }
  mint &operator-=(mint b) {
    if ((x -= b.x) < 0)
      x += M;
    return *this;
  }
  mint operator-(mint b) {
    mint res = *this;
    res -= b;
    return res;
  }
  mint &operator*=(mint b) {
    x = (ll)x * b.x % M;
    return *this;
  }
  mint operator*(mint b) {
    mint res = *this;
    res *= b;
    return res;
  }
  mint inverse() { return rev(x, M); }
  mint &operator/=(mint b) {
    x = (ll)x * rev(b.x, M) % M;
    return *this;
  }
  mint operator/(mint b) {
    mint res = *this;
    res /= b;
    return res;
  }
  mint operator^(ll w) {
    mint r = 1, a = *this;
    while (w) {
      if (w & 1)
        r *= a;
      a *= a;
      w /= 2;
    }
    return r;
  }
  mint operator^=(ll w) { return *this = (*this) ^ w; }
  mint operator^(mint w) { return *this ^ w.x; }
  mint operator^=(mint w) { return *this = (*this) ^ w; }
  mint operator-() const { return mint() - *this; }
  explicit operator bool() const { return x; }
};
istream &operator>>(istream &is, mint &p) {
  istream &res = is >> p.x;
  p.x %= M;
  return res;
}
ostream &operator<<(ostream &os, mint p) { return os << p.x; }
template <typename T> mint operator+(T x, mint y) { return mint(x) + y; }
template <typename T> mint operator-(T x, mint y) { return mint(x) - y; }
template <typename T> mint operator*(T x, mint y) { return mint(x) * y; }
template <typename T> mint operator/(T x, mint y) { return mint(x) / y; }
template <typename T> mint operator^(T x, mint y) { return mint(x) ^ y; }
int a[N];
const int C = 1e6 + 1;
mint c[C], kek[C];
int lp[C], pr[C], cpr = 0, pw[C];
mint g[C];
int32_t main() {
  int n;
  cin >> n;
  forn(i, n) {
    cin >> a[i];
    c[a[i]] += a[i];
  }
  for (int i = 1; i < C; ++i)
    for (int j = i; j < C; j += i)
      kek[i] += c[j];
  for (int i = 2; i < C; ++i) {
    if (!lp[i]) {
      pr[cpr++] = lp[i] = i;
      pw[i] = 1;
    }
    for (int j = 0; j < cpr && pr[j] <= lp[i] && i * pr[j] < C; ++j)
      lp[i * pr[j]] = pr[j];
    if (pw[i] && i * lp[i] < C)
      pw[i * lp[i]] = pw[i] + 1;
  }
  g[1] = 1;
  for (int i = 2; i < C; ++i) {
    if (pw[i]) {
      g[i] = (mint(1) - lp[i]) / i;
    } else {
      int x = 1, y = i, p = lp[i];
      while (lp[y] == p)
        x *= p, y /= p;
      g[i] = g[x] * g[y];
    }
  }
  mint ans = 0;
  for (int i = 1; i < C; ++i) {
    ans += (g[i] * kek[i]) * kek[i];
  }
  forn(i, n) ans -= a[i];
  ans /= 2;
  cout << ans << '\n';

  return 0;
}