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
微信外部浏览器或短信链接唤起微信小程序的解决方案
微信外部浏览器或短信链接唤起微信小程序的解决方案
3955 1
|
存储 Prometheus 监控
K3S环境下接入Prometheus,grafana,等监控套件
因为常规的监控都是用K8S做的,而K3S上的监控方案少之又少,如果直接用rancher上的prometheus监控,会消耗至少2G的内存,于是我们就自己做了K3S和pg数据库的监控,并且通过我们自己做的监控,可以减少一些不必要的性能开销。主要监控容器资源消耗,宿主机资源消耗,pg数据库资源消耗
5367 0
K3S环境下接入Prometheus,grafana,等监控套件
|
开发工具
成功解决 zsh: command not found
成功解决 zsh: command not found
3871 0
|
网络协议 Linux
clash端口问题
clash使用的注意事项
8280 0
|
8月前
|
人工智能 边缘计算 运维
增长指数全球第一,阿里云入选沙利文中国企业出海采用云服务市场领导者象限
沙利文Frost & Sullivan发布《2025年中国企业出海采用云服务市场研究》,阿里云连续三年综合竞争力稳居“领导者”象限,是唯一进入该象限的中国厂商。此外,在综合竞争力增长指数上,阿里云荣获全球第一。
|
人工智能 程序员 开发者
2025年程序员如何挣钱?卓伊凡的七条职业发展路径分析-优雅草卓伊凡
2025年程序员如何挣钱?卓伊凡的七条职业发展路径分析-优雅草卓伊凡
647 6
|
8月前
|
负载均衡 安全 应用服务中间件
为本地部署的大模型添加API Key认证:Nginx实现方案
本文介绍如何用 Nginx 为 Ollama/vLLM 等本地大模型服务添加 API Key 认证——零代码修改、配置即用,支持鉴权、限流与 HTTPS,让私有模型服务安全可控,调用方式与 OpenAI 完全兼容。(239字)
3062 1
|
边缘计算 人工智能 云计算
HIS系统的核心模块:医生工作站
医生工作站是HIS系统的核心模块,围绕诊疗流程一体化、电子病历智能化、医嘱闭环管理、辅助决策支持及移动化操作五大方面优化医疗流程。它整合患者信息,提供结构化病历生成与质控,实现医嘱全流程追踪,结合药品和诊疗知识库辅助决策,并支持多场景便捷操作。通过数据整合与智能工具,提升诊疗效率与质量,助力智慧医疗发展。
956 2
|
11月前
|
数据安全/隐私保护
申威架构Kylin10安装ntfs-3g-2017.3.23-11.ky10.sw_64.rpm详细步骤(命令行+图形界面)
ntfs-3g-2017.3.23-11.ky10.sw_64.rpm是专为银河麒麟V10申威平台编译的NTFS驱动,支持该系统下NTFS磁盘读写。仅适用于Kylin 10 + SW架构,可通过命令行或图形界面安装,安装后可用rpm命令验证是否成功。
1239 2
|
存储 供应链 安全
区块链在物流管理中的应用:让货物管理变得更智能
区块链在物流管理中的应用:让货物管理变得更智能
2820 15