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

题意

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

(n leq 250)

题解

orz QiuQiu

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

(L_i = lceilsqrt{n^2 -i^2} ceil, R_i = min(2n - 1, lfloorsqrt{4n^2 - i^2} floor)), 显然(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的就不放了(。

原文地址:https://www.cnblogs.com/clover4/p/15306468.html