//https://codeforces.com/contest/1754/problem/E
#include<bits/stdc++.h>
#include<unordered_map>
#include<array>
#define ll long long
#define ull unsigned long long
#define all(a) a.begin(),a.end()
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int inf = 2e9 + 2;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-4;
const ll mod = 998244353;
const int N = 2e5 + 5;
/*
dp[i] : 还需要i次成功交换时的期望
p : 成功交换的概率(会随着i变化)
再一次成功交换之间的所有操作, p相同,为独立事件, 所以期望可以相加
dp[i] = dp[i] * (1 - p) + dp[i - 1] * p + 1
这个位置交换不成功的期望 + 这个位置交换成功的期望 + 这次交换让次数加上1
dp[i] = dp[i - 1] + 1/p
*/
#define int ll
int n, a[N];
ll qpow(ll base, ll pow)
{
ll ans = 1;
while (pow)
{
if (pow & 1)
ans = ans * base % mod;
pow >>= 1;
base = base * base % mod;
}
return ans;
}
void solve()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
int cnt0 = 0;
for (int i = 1; i <= n; i++)
cnt0 += 1 - a[i];
int cnt = 0;
for (int i = 1; i <= cnt0; i++)
cnt += a[i];
int ans = 0;
for (int i = 1; i <= cnt; i++)
{
int res = n * (n - 1) % mod * qpow(2, mod - 2) % mod * qpow(i, 2 * (mod - 2)) % mod;
ans = (ans + res) % mod;
}
cout << ans << '\n';
}
signed main()
{
IOS;
int t = 1;
cin >> t;
while (t--)
solve();
return 0;
}
E - Wish I Knew How to Sort(几何分布, 期望dp)
最新推荐文章于 2023-07-04 10:42:08 发布