题目
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 之前肯定不能经过其他禁止点,只有无论怎么走都行。可得
复杂度:\(O(m^2)\)
注意
- 为了无后效性,请先排序(三关键字)
- 如何输出答案:加一个禁止点 (n,n,n) ,最后输出 F[m] ,即不经过所有障碍到 (n,n,n) 的方案
- 需要逆元,否则会炸 (OI-WIKI)