JZOJ5384. 【NOIP2017提高A组模拟9.23】四维世界

题目

Description

众所周知,我们常感受的世界是三维的。
Polycarp突然对四维空间产生了兴趣,他想对四维空间进行一些研究。但是在此之前,他必须先对三维世界了解透彻。
于是Polycarp决定从零维,也就是一个点,开始他的研究。
我们把一个点放在三维空间中,Polycarp把这个点视为原点,并确定了三个正方向。
他可以把这个点往三个方向之一拉伸一个单位,那么这个点就变为了一维的一条长度为一的线段。
然后如果他把这条线段往另一方向拉伸一个单位,那么这条线就变为了二维的一个矩形。
如果继续拉伸可能就会进入三维世界,也就是变为直四棱柱。
Polycarp认为矩形、线段甚至点都可以看作某一维或某几维为丰的直四棱柱。
现在Polycarp想演示把一个点一步一步拉伸为边长为n的正六面体的过程,
但他缺失了m种形态的直四棱柱模具(Polycarp拥有其他的所有直四棱柱模具),他想知道共有多少种演示方案。
Polycarp的演示过程需要每拉伸一个单位时对应形态的直四棱柱。因为方案数很大,所以输出答案对10^9+7的结果。

Input

从文件poly.in中读入数据。
第一行两个整数n;m,分别表示直四棱柱的边长和他缺失的模具数量。
接下来m行,第i行三个整数x; y; z,表示第i个缺失模具的长、宽、高。
2 3
1 0 1
1 1 1
0 2 0

Output

输出到文件poly.out中。一个整数,即答案。
36

Data Constraint

题目大意

求从 (0,0,0) 到 (n,n,n) 不经过某些点的方案数

题解

20 分

暴力 DFS ,不经过一些点,搜到终点 +1
复杂度:\(O(?)\)

40 分

设 F[i][j][k] 为从 (0,0,0) 到 (i,j,k) 的方案数,若不能走就标记一下,初始 F[0][0][0]=1
复杂度:\(O(n^3)\)

60 分

若 m=0 求的是从 (0,0,0) 到 (n,n,n) 的方案数
由于一共要走 3n 步,方案数为\(C^n_{3n}\bullet C^n_{2n}\bullet C^n_n=\dfrac{(3n)!(2n)!}{n!(2n)!n!n!}=\dfrac{(3n)!}{n!n!n!}\)

100 分

我们设 F[i] 为从 (0,0,0) 到第 i 个禁止点不经过其他禁止点的方案数,设第 i 个禁止点为 \((x_i,y_i,z_i)\)
同 60 分做法,若经过禁止点的方案数为 \(\dfrac{(x_i+y_i+z_i)!}{x_i!y_i!z_i!}\) ,可先算出再减去经过禁止点的方案
一个经过禁止点的方案肯定有其第一个经过的禁止点。设这个禁止点为 j 。
那么 j 之前肯定不能经过其他禁止点,只有无论怎么走都行。可得

\[F_i=\dfrac{(x_i+y_i+z_i)!}{x_i!y_i!z_i!}-\sum_{x_j\le x_i,y_j\le y_i,z_j\le z_i}\dfrac{(x_i-x_j+y_i-y_j+z_i-z_j)!}{(x_i-x_j)!(y_i-y_j)!(z_i-z_j)!} \]

复杂度:\(O(m^2)\)

注意
  1. 为了无后效性,请先排序(三关键字)
  2. 如何输出答案:加一个禁止点 (n,n,n) ,最后输出 F[m] ,即不经过所有障碍到 (n,n,n) 的方案
  3. 需要逆元,否则会炸 (OI-WIKI
posted @ 2021-01-02 22:03  小蒟蒻laf  阅读(91)  评论(0)    收藏  举报