题目描述
你现在有一个长度为 n 的数组 a。一开始,所有 ai 均为 0。给出一个同样长度为 n 的目标数组 b。求有多少种方案,使得通过若干次以下操作,可以让 a 数组变成 b。
- 选出两个不同的下标 1≤i<j≤n,并将 ai 和 aj 同时增加 1。
两种方案被称之为不同的,当且仅当存在一个 x 使得一种方案中第 x 次操作选择的两个下标 (i,j) 与另一种方案中的不同。
答案对 998244353 取模。
输入格式
从标准输入读入数据。
输入数据一共包含两行。
第一行包含一个正整数 n。
第二行包含 n 个正整数,表示 b1,b2,…,bn。
输出格式
输出到标准输出。
输出一行一个正整数,表示将 a 数组通过若干次操作变成 b 数组的方案数对 998244353 取模后的结果。
4
2 2 2 2
90
提示
【样例 1 解释】
| 种类编号 |
第一组 |
第二组 |
第三组 |
第四组 |
方案数 |
| 1 |
1<->2 |
3<->4 |
(24)=6 |
| 2 |
1<->3 |
2<->4 |
| 3 |
1<->4 |
1<->4 |
2<->3 |
2<->3 |
| 4 |
1<->2 |
3<->4 |
4!=24 |
| 5 |
1<->3 |
2<->4 |
| 6 |
1<->3 |
1<->4 |
2<->3 |
2<->4 |
总方案数是 6×3+24×3=90。
【样例 2】
见选手文件中的 array/array2.in 与 array/array2.ans。
此样例满足测试点 6∼8 的限制。
【样例 3】
见选手文件中的 array/array3.in 与 array/array3.ans。
此样例满足测试点 12∼14 的限制。
【样例 4】
见选手文件中的 array/array4.in 与 array/array4.ans。
此样例满足测试点 15∼18 的限制。
【样例 5】
见选手文件中的 array/array5.in 与 array/array5.ans。
此样例满足测试点 19∼20 的限制。
【样例 6】
见选手文件中的 array/array6.in 与 array/array6.ans。
此样例满足测试点 21∼22 的限制。
【样例 7】
见选手文件中的 array/array7.in 与 array/array7.ans。
此样例满足测试点 23∼25 的限制。
【数据范围】
对于 100% 的数据,1≤n≤5 000,1≤bi≤3×104,∑bi≤3×104。
| 测试点编号 |
n |
∑bi |
| 1 |
≤5 000 |
≡1(mod2) |
| 2∼3 |
=1 |
≤3×104 |
| 4∼5 |
=2 |
| 6∼8 |
≤5 |
≤8 |
| 9∼11 |
≤20 |
=n |
| 12∼14 |
≤5 000 |
| 15∼18 |
≤16 |
| 19∼20 |
≤700 |
≤700 |
| 21∼22 |
≤5 000 |
≤5 000 |
| 23∼25 |
≤5 000 |
≤3×104 |