cats 的凸包计算
Problem Description
定义一个排列 p1,p2,⋯,pn 的面积为:将排列中的每个数 pi 看做二维坐标平面上的一个点 (i,pi),这 n 个点的凸包的面积。
现在 cats 有一个长为 n 的数组 a1,a2,⋯,an,其中每个数均为一个 1 到 n 之间的正整数或 −1。你需要求出将所有 −1 替换成 1 到 n 之间的正整数后,形成的所有排列的面积之和对 109+7 取模的结果。
可以证明答案一定可以被表示为一个有理数 yx。其中 x 与 y 互质。你需要输出 x⋅y−1mod(109+7)。可以证明 (109+7)∤y。
注1:一个长为 n 的数组 p1,p2,⋯pn 是一个排列,当且仅当 1 到 n 之间的每一个正整数都在 p1,p2,⋯pn 中出现且仅出现一次。
注2:n 个点 (x1,y1),(x2,y2),⋯,(xn,yn) 的凸包为:所有满足存在 n 个范围在 [0,1] 之间的实数 w1,w2,⋯,wn ,使得 ∑i=1nwi=1,∑i=1nwi⋅xi=x,∑i=1nwi⋅yi=y 的点 (x,y) 在二维坐标平面上组成的图形。
第一行包含一个整数 T (1≤T≤1000),表示一共有 T 组测试数据。
每组测试数据的第一行包含一个整数 n (1≤n≤50),表示数组 a 的长度。
每组测试数据的第二行包含 n 个整数 a1,a2,⋯an (−1≤ai≤n,ai=0),表示数组 a。
保证对于任意的 1≤i<j≤n,若 ai 和 aj 均不为 −1,则 ai=aj。
保证所有测试数据的 n3 之和不超过 5⋅105。
Output
对于每组测试数据,输出一个整数,表示形成的所有排列的面积之和对 109+7 取模的结果。
5
3
1 2 3
4
2 -1 -1 3
4
1 2 -1 3
1
1
7
-1 -1 -1 -1 -1 -1 -1
Sample Output
0
9
500000006
0
99546
Source
2024“钉耙编程”中国大学生算法设计超级联赛(8)