A. 集合划分

可以直接写出一个简单的 \(dp\),然后发现这个 \(dp\) 的信息只需要存 \(A\) 集合选的个数和末尾选的哪个集合。
不妨写成一个多项式,那么我们只关心边界的情况。
所以写一个分治 \(FFT\) 即可。
 

B. ACT4!⽆限回转!

考虑对于每条边,枚举所有能到达这条边的角度,计算出合法的面积。
所以只需要对角度进行积分即可。
为了方便地计算出这个东西,可以对边的左右端点分别积分,计算每个角度的射线以右的面积。
发现单点求值只需要在凸包上二分即可计算出来,所以写个辛普森积分就完了。
 

C. 积木

要求的是 \(\sum \limits_{i,j}\frac{(a_i+b_i+c_i+a_j+b_j+c_j)!}{(a_i+a_j)!(b_i+b_j)!(c_i+c_j)!}\)
这个组合数可以用类似范德蒙恒等式的东西,开一个桶并暴力查桶,来做到 \(O(n * \sum \limits_{i}a_ib_i)\) 求出对于每个 \(i\) 的答案。
其实这个问题还等价于对于所有的路径求和。
发现值域不大,而且只需要输出一个数,所以在三维网格上 \(dp\) 一下即可。