Let $n$ be an integer. Consider all permutations on integers $1$ to $n$ in lexicographic order, and concatenate them into one big sequence $p$. For example, if $n = 3$, then $p = [1, 2, 3, 1, 3, 2, 2, 1, 3, 2, 3, 1, 3, 1, 2, 3, 2, 1]$. The length of this sequence will be $n \cdot n!$.
Let $1 \leq i \leq j \leq n \cdot n!$ be a pair of indices. We call the sequence $(p_i, p_{i+1}, \dots, p_{j-1}, p_j)$ a subarray of $p$. Its length is defined as the number of its elements, i.e., $j – i + 1$. Its sum is the sum of all its elements, i.e., $\sum_{k=i}^j p_k$.
You are given $n$. Find the number of subarrays of $p$ of length $n$ having sum $\frac{n(n+1)}{2}$. Since this number may be large, output it modulo $998244353$ (a prime number).
Input
The only line contains one integer $n$ ($1 \leq n \leq 10^6$), as described in the problem statement.
Output
Output a single integer — the number of subarrays of length $n$ having sum $\frac{n(n+1)}{2}$, modulo $998244353$.
Examples
input
3
output
9
input
4
output
56
input
10
output
30052700
Note
In the first sample, there are $16$ subarrays of length $3$. In order of appearance, they are:
$[1, 2, 3]$, $[2, 3, 1]$, $[3, 1, 3]$, $[1, 3, 2]$, $[3, 2, 2]$, $[2, 2, 1]$, $[2, 1, 3]$, $[1, 3, 2]$, $[3, 2, 3]$, $[2, 3, 1]$, $[3, 1, 3]$, $[1, 3, 1]$, $[3, 1, 2]$, $[1, 2, 3]$, $[2, 3, 2]$, $[3, 2, 1]$.
Their sums are $6$, $6$, $7$, $6$, $7$, $5$, $6$, $6$, $8$, $6$, $7$, $5$, $6$, $6$, $7$, $6$. As $\frac{n(n+1)}{2} = 6$, the answer is $9$.
Solution:
#include <bits/stdc++.h> using namespace std; const int md = 998244353; inline void add(int &a, int b) { a += b; if (a >= md) a -= md; } inline void sub(int &a, int b) { a -= b; if (a < 0) a += md; } inline int mul(int a, int b) { return (int) ((long long) a * b % md); } inline int power(int a, long long b) { int res = 1; while (b > 0) { if (b & 1) { res = mul(res, a); } a = mul(a, a); b >>= 1; } return res; } inline int inv(int a) { a %= md; if (a < 0) a += md; int b = md, u = 0, v = 1; while (a) { int t = b / a; b -= t * a; swap(a, b); u -= t * v; swap(u, v); } assert(b == 1); if (u < 0) u += md; return u; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; vector<int> fact(n + 1); fact[0] = 1; for (int i = 0; i < n; i++) { fact[i + 1] = mul(fact[i], i + 1); } vector<int> cc(n + 1); for (int i = 1; i <= n; i++) { cc[i] = mul(fact[n], inv(fact[i])); } int ans = 1; for (int i = 1; i < n; i++) { int cur = cc[i]; sub(cur, cc[i + 1]); add(ans, mul(cur, n - i)); } cout << ans << '\n'; return 0; }