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