Educational Codeforces Round 113 (Rated for Div. 2)C. Jury Meeting

简介: Educational Codeforces Round 113 (Rated for Div. 2)C. Jury Meeting

C. Jury Meeting

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output


nn people gathered to hold a jury meeting of the upcoming competition, the ii-th member of the jury came up with aiai tasks, which they want to share with each other.


First, the jury decides on the order which they will follow while describing the tasks. Let that be a permutation pp of numbers from 11 to nn (an array of size nn where each integer from 11 to nn occurs exactly once).


Then the discussion goes as follows:


  • If a jury member p1p1 has some tasks left to tell, then they tell one task to others. Otherwise, they are skipped.
  • If a jury member p2p2 has some tasks left to tell, then they tell one task to others. Otherwise, they are skipped.
  • ...
  • If a jury member pnpn has some tasks left to tell, then they tell one task to others. Otherwise, they are skipped.
  • If there are still members with tasks left, then the process repeats from the start. Otherwise, the discussion ends.


A permutation pp is nice if none of the jury members tell two or more of their own tasks in a row.


Count the number of nice permutations. The answer may be really large, so print it modulo 998244353998244353.


Input


The first line contains a single integer tt (1≤t≤1041≤t≤104) — the number of test cases.


The first line of the test case contains a single integer nn (2≤n≤2⋅1052≤n≤2⋅105) — number of jury members.


The second line contains nn integers a1,a2,…,ana1,a2,…,an (1≤ai≤1091≤ai≤109) — the number of problems that the ii-th member of the jury came up with.


The sum of nn over all test cases does not exceed 2⋅1052⋅105.


Output


For each test case, print one integer — the number of nice permutations, taken modulo 998244353998244353.


Example


input


Copy

4

2

1 2

3

5 5 5

4

1 3 3 7

6

3 4 2 1 3 3


output


Copy

1

6

0

540

Note


Explanation of the first test case from the example:


There are two possible permutations, p=[1,2]p=[1,2] and p=[2,1]p=[2,1]. For p=[1,2]p=[1,2], the process is the following:


  1. the first jury member tells a task;
  2. the second jury member tells a task;
  3. the first jury member doesn't have any tasks left to tell, so they are skipped;
  4. the second jury member tells a task.


So, the second jury member has told two tasks in a row (in succession), so the permutation is not nice.


For p=[2,1]p=[2,1], the process is the following:


  1. the second jury member tells a task;
  2. the first jury member tells a task;
  3. the second jury member tells a task.


So, this permutation is nice.


#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5 + 5;
const int M = 1e5 + 5;
const ll mod = 998244353;
ll qpow(ll a, ll b) {//快速幂改编用法
  ll res = 1;
  while (b) {
    if (b & 1)
      res = res * a % mod;
    a = (a * a) % mod;
    b >>= 1;
  }
  return res;
}
int n, m, t;
ll a[N];
ll pre[N];//pre[i]=1*2*...*i
ll A(ll nn, ll mm) {
  return pre[nn] * qpow(pre[nn - mm], mod - 2) % mod;
}
void solve() {
  cin >> n;
  ll maxx = -1;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  sort(a, a + n);
  if (a[n - 1] >= a[n - 2] + 2)//发现bug,爬5 3 2>>0
    cout << 0 << '\n';
  else if (a[n - 1] == a[n - 2])//发现新世界,起飞 5 5 5>>6
    cout << pre[n] << '\n';
  else {//出现狗屎一样的第三种情况 5 4 3 >>3
    int cnt = 0;
    for (int i = 0; i < n; i++) {//并列第二名有几个
      if (a[i] == a[n - 2])
        cnt++;//最大值不能在所有次大值的最右边
    }
    ll ans = pre[n];//全排列>>意味着所有情况
    for (int i = n; i >= cnt + 1; i--) { //i是最大值的位置 枚举i所在位置不是好序列的方案数
      ll res = (A(i - 1, cnt) * pre[n - cnt - 1]) % mod;//此处难点
      //cout<<res<<'\n';
      ans = (ans - res + mod) % mod;
    }
    cout << ans % mod << '\n';
  }
}
int main() {
  cin >> t;
  pre[0] = 1;
  for (int i = 1; i <= 2e5; i++) {
    pre[i] = (pre[i - 1] * i) % mod;//全排列
  }
  while (t--) {
    solve();
  }
}
相关文章
|
移动开发 小程序 API
微信外部浏览器或短信链接唤起微信小程序的解决方案
微信外部浏览器或短信链接唤起微信小程序的解决方案
2681 1
|
Java 开发工具 Android开发
【 uniapp 】打包Android的apk(原生APP-云打包),及发布测试
【 uniapp 】打包Android的apk(原生APP-云打包),及发布测试
【 uniapp 】打包Android的apk(原生APP-云打包),及发布测试
|
XML 数据可视化 Java
非常轻量、高性能、可集成、可扩展的流程引擎compileflow
compileflow Process引擎是淘宝工作流TBBPM引擎之一,是专注于纯内存执行,无状态的流程引擎,通过将流程文件转换生成java代码编译执行,简洁高效。当前是阿里业务中台交易等多个核心系统的流程引擎。
|
9月前
|
存储 供应链 安全
区块链在物流管理中的应用:让货物管理变得更智能
区块链在物流管理中的应用:让货物管理变得更智能
1021 15
|
9月前
|
安全 Linux 数据安全/隐私保护
Linux权限揭秘“Root与Sudo”
Root用户是Linux系统中的超级用户,拥有对系统的完全控制权。Root用户几乎可以执行任何命令,修改任何文件,甚至删除系统上的所有内容。因此,Root用户的使用需要非常谨慎,以避免潜在的安全风险。
448 6
|
运维 前端开发 Ubuntu
阿里云云效操作报错合集之部署执行source .bashrc报错,提示找不到source命令,是什么原因
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
Exception in thread "main" java.lang.IllegalArgumentException: U+6570 ('.notdef') is not available in the font Helvetica-Bold, encoding: WinAnsiEncoding 问题解决
【5月更文挑战第26天】Exception in thread "main" java.lang.IllegalArgumentException: U+6570 ('.notdef') is not available in the font Helvetica-Bold, encoding: WinAnsiEncoding 问题解决
960 2
|
消息中间件 存储 中间件
微服务异步架构---MQ之RocketMQ(一)
“我们大家都知道把一个微服务架构变成一个异步架构只需要加一个MQ,现在市面上有很多MQ的开源框架。到底选择哪一个MQ的开源框架才合适呢?”
微服务异步架构---MQ之RocketMQ(一)
|
编解码 数据可视化 定位技术
Python中gdal读取多波段HDF栅格遥感影像数据图层文件并依据像素绘制直方图
Python中gdal读取多波段HDF栅格遥感影像数据图层文件并依据像素绘制直方图
345 1
|
应用服务中间件 nginx
Nginx源码阅读:nginx_shmtx共享互斥锁(进程锁)
Nginx源码阅读:nginx_shmtx共享互斥锁(进程锁)
281 0