题意
给一个整数\(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的就不放了(。