首先排列中第 个元素作为前 个元素的最小值的概率为 ,
设 表示排列第 个元素是否为前 个元素的最小值, 值为 ,
根据题目要求, 期望为 ,
当 时, 的概率为 , 在上式对期望的贡献为 .
当 时, 的概率为 ,
在上式对期望的贡献为 .
所以 的期望为 ,
然后使用 乘上 即为题目中的答案 .
#include<bits/stdc++.h>
#define reg register
int read(){
char c;
int s = 0, flag = 1;
while((c=getchar()) && !isdigit(c))
if(c == '-'){ flag = -1, c = getchar(); break ; }
while(isdigit(c)) s = s*10 + c-'0', c = getchar();
return s * flag;
}
const int maxn = 1e5 + 10;
const int mod = 998244353;
int N;
int Q_;
int inv[maxn];
int fac[maxn];
int sum_1[maxn];
int sum_2[maxn];
void Work(){
N = read();
int Ans = (sum_1[N] - sum_2[N] + mod) % mod;
Ans = (1ll*Ans + (1ll*sum_1[N]*sum_1[N]%mod)) % mod;
Ans = 1ll*Ans*fac[N] % mod;
printf("%d
", Ans);
}
int main(){
Q_ = read();
fac[0] = 1; for(reg int i = 1; i < maxn; i ++) fac[i] = 1ll*fac[i-1]*i % mod;
inv[1] = 1; for(reg int i = 2; i < maxn; i ++) inv[i] = ((-1ll*mod/i*inv[mod%i])%mod + mod) % mod;
for(reg int i = 1; i < maxn; i ++){
sum_1[i] = (sum_1[i-1] + inv[i]) % mod;
sum_2[i] = (sum_2[i-1] + (1ll*inv[i]*inv[i]%mod)) % mod;
}
while(Q_ --) Work();
return 0;
}