[做题记录-计数][AGC036F] Square Constraints

题意

给一个整数\(n\), 求有多少排列\(P\)满足对于任意\(i\in [0, 2n - 1]\)满足\(n^2 \leq i^2 +P_i^2\leq (2n)^2\), 答案对一个数取模。

\(n \leq 250\)

题解

orz QiuQiu

考虑先处理出每个位置的上下界。

\(L_i = \lceil\sqrt{n^2 -i^2}\rceil, R_i = min(2n - 1, \lfloor\sqrt{4n^2 - i^2}\rfloor)\), 显然\(L, R\)都是单调的。

对于单调的限制, 如果只有一维的话是经典的, 比如如果只有\(R\)这一维的话, \(ans = \prod_{i = 0}^{2n - 1} (R_i + 1 - (2n - i - 1))\)
但是现在有两维, 一个想法就是钦定哪些位置在下面, 然后做dp, 但是这样的话会破坏有序性而导致贡献难以计算。
一个性质是你发现在\(i > n\)的时候, \(L_i\)都是\(0\), 在\(i < n\)的时候, \(L_i < n\)\(R_i > n\), 于是\(L, R\)是不相交的, 所以给人一种可以分开算的感觉。

考虑把\([0, n - 1]\)\(L\)\([n, 2n)\)\(R\)放一起排序, 那么对于\([n, 2n - 1]\)的部分只要考虑自己占的部分以及以及选了\(j\)个钦定位置即可。对于\([0, n - 1]\)的部分在取\(L - 1\)的时候也和差不多, 对于\([0, n - 1]\)\(R\)的部分, 考虑\([n, 2n - 1]\)中的点在其前面, 还有\([0, n - 1]\)中间的按\(R\)会排在当前点前面的部分以及钦定了是\(L\)的部分, 然后dp就可以算恰好\(i\)个在下面的贡献了, 直接容斥算答案即可。

代码由于看了QiuQiu的就不放了(。

posted @ 2021-09-17 21:55  HN-wrp  阅读(38)  评论(0编辑  收藏  举报