You are given two arrays a and b, both of length n.

Let's define a function f(l, r) = ∑_{l ≤ i ≤ r} a_i ⋅ b_i.

Your task is to reorder the elements (choose an arbitrary order of elements) of the array b to minimize the value of ∑_{1 ≤ l ≤ r ≤ n} f(l, r). Since the answer can be very large, you have to print it modulo 998244353. Note that you should minimize the answer but not its remainder.

Input

The first line of the input contains one integer n (1 ≤ n ≤ 2 ⋅ 10^5) — the number of elements in a and b.

The second line of the input contains n integers a_1, a_2, ..., a_n (1 ≤ a_i ≤ 10^6), where a_i is the i-th element of a.

The third line of the input contains n integers b_1, b_2, ..., b_n (1 ≤ b_j ≤ 10^6), where b_j is the j-th element of b.

Output

Print one integer — the minimum possible value of ∑_{1 ≤ l ≤ r ≤ n} f(l, r) after rearranging elements of b, taken modulo 998244353. Note that you should minimize the answer but not its remainder.

Examples

Input


5
1 8 7 2 4
9 7 2 9 3


Output


646


Input


1
1000000
1000000


Output


757402647


Input


2
1 3
4 2


Output


20
#include <bits/stdc++.h>
using namespace std;
int xx[4] = {1, -1, 0, 0};
int yy[4] = {0, 0, 1, -1};
const double eps = 1e-9;
const int maxn = 2e6 + 5000;
const long long mod = 1e9 + 7;
const int INF(0x3f3f3f3f);
const long long INFL(0x3f3f3f3f3f3f3f3fll);
inline int sign(double a) { return a < -eps ? -1 : a > eps; }
long long mul(long long a, long long b, long long c) {
  long long res = 1;
  while (b) {
    if (b & 1) res *= a, res %= c;
    a *= a, a %= c, b >>= 1;
  }
  return res;
}
long long phi(long long x) {
  long long res = x;
  for (long long i = 2; i * i <= x; i++) {
    if (x % i == 0) res = res / i * (i - 1);
    while (x % i == 0) x /= i;
  }
  if (x > 1) res = res / x * (x - 1);
  return res;
}
template <typename A, typename B>
inline bool chmin(A& a, B b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename A, typename B>
inline bool chmax(A& a, B b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename A, typename B>
inline long long add(A x, B y) {
  if (x + y < 0) return x + y + mod;
  return x + y >= mod ? x + y - mod : x + y;
}
template <typename A, typename B>
inline void add2(A& x, B y) {
  if (x + y < 0)
    x = x + y + mod;
  else
    x = (x + y >= mod ? x + y - mod : x + y);
}
template <typename A, typename B>
inline long long mul1(A x, B y) {
  return 1ll * x * y % mod;
}
template <typename A, typename B>
inline void mul2(A& x, B y) {
  x = (1ll * x * y % mod + mod) % mod;
}
template <typename A>
inline void debug(A a) {
  cout << a << '\n';
}
template <typename A>
inline long long sqr(A x) {
  return 1ll * x * x;
}
template <typename A>
A inv(A x) {
  return mul(x, mod - 2);
}
template <typename A>
void bugl(A a[], int l, int r) {
  for (int i = l; i <= r; i++) cout << a[i] << " ";
  cout << endl;
}
template <typename A>
void bug(A a[], int l, int r) {
  for (int i = l; i <= r; i++) cout << a[i] << " ";
  cout << endl;
}
template <class T>
void wt(const T& x) {
  cout << x << endl;
}
template <class T>
void wt(const T& x, char c) {
  cout << x << c;
}
template <class T>
void wt(const T& x, const string& s) {
  cout << x << s;
}
template <class T>
void wt(const T& x, int rnd) {
  cout << fixed << setprecision(rnd) << x << endl;
}
inline void debug() { cout << "###!!!" << endl; }
inline long long read() {
  char c = getchar();
  long long x = 0, f = 1;
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') x = 1ll * x * 10 + c - '0', c = getchar();
  return x * f;
}
int fa[maxn];
int Find(int x) {
  if (x != fa[x]) return fa[x] = Find(fa[x]);
  return fa[x];
}
long long n, k;
long long a[maxn];
long long b[maxn];
int main() {
  while (cin >> n) {
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) cin >> b[i];
    for (long long i = 1; i <= n; i++) {
      a[i] *= ((n - i + 1) * i);
    }
    sort(a + 1, a + 1 + n);
    sort(b + 1, b + 1 + n, greater<int>());
    long long ans = 0;
    for (int i = 1; i <= n; i++) {
      ans += (a[i] % 998244353ll) * (b[i] % 998244353);
      ans %= 998244353ll;
    }
    wt(ans);
  }
  return 0;
}
