题意:
给定值域在 [ 0 , n − 1 ] [0,n-1] [0,n−1] 的序列 a 1 , ⋯ , a m a_1,\cdots,a_{m} a1,⋯,am,要求构造值域在 [ 0 , n − 1 ] [0,n-1] [0,n−1] 的序列 b 1 , ⋯ , b m b_1,\cdots,b_{m} b1,⋯,bm 和 c 1 , ⋯ , c m c_1,\cdots,c_{m} c1,⋯,cm,使得 b i b_i bi 两两不同、 c i c_i ci 两两不同、且 ∀ i , b i + c i ≡ a i ( m o d n ) \forall i,b_i+c_i\equiv a_i\pmod n ∀i,bi+ci≡ai(modn)。
n ≤ 1 0 5 n\leq 10^5 n≤105。
题解:
首先说明有解的充要条件:
- 若 m < n m<n m<n,则一定有解;
- 若 m = n m=n m=n,则有解当且仅当 ∑ a i ≡ 0 ( m o d n ) \sum a_i\equiv 0\pmod n ∑ai≡0(modn)。
必要性显然。下面的构造性算法将会说明充分性:
考虑逐位构造并调整。假设 a a a 序列的前 i i i 位已经有了对应的 b , c b,c b,c,现在需要构造 a i a_i ai。
对于 i < n i<n i<n 时,可以选出两个未在 b b b 中出现的数字 x , y x,y x,y,构造 ( a i , x , y ) (a_i,x,y) (ai,x,y):令 b i = x , c i = a i − x b_i=x,c_i=a_i-x bi=x,ci=ai−x。
此时若 c i c_i ci 未出现过则构造成功。若 c i c_i ci 已经出现过了,假设出现在了 c j c_j cj,那么我们递归构造 ( a j , y , b j ) (a_j,y,b_j) (aj,y,bj)。
整个过程如左图所示。
可以证明过程中不会出现循环情况:若出现了,如右图,则必有 { t 1 + v 3 ≡ a j 1 ≡ t 2 + v 2 t 2 + v 4 ≡ a j 2 ≡ t 3 + v 3 t 3 + v 5 ≡ a j 3 ≡ t 1 + v 4 → v 2 = v 5 \begin{cases}t_1+v_3\equiv a_{j_1}\equiv t_2+v_2\\t_2+v_4\equiv a_{j_2}\equiv t_3+v_3\\t_3+v_5\equiv a_{j_3}\equiv t_1+v_4\end{cases}\to v_2=v_5 ⎩⎪⎨⎪⎧t1+v3≡aj1≡t2+v2t2+v4≡aj2≡t3+v3t3+v5≡aj3≡t1+v4→v2=v5,矛盾。
所以对于 i < n i<n i<n 的情况我们一定可以构造成功。而对于 i = n i=n i=n 的情况,发现只要满足 ∑ a i ≡ 0 ( m o d n ) \sum a_i\equiv 0\pmod n ∑ai≡0(modn) 那么剩下的 b n , c n b_n,c_n bn,cn 一定满足要求。
我们先将 a i a_i ai 随机打乱。那么每次递归构造 ( a i , x , y ) (a_i,x,y) (ai,x,y) 的时候,扔进来的 x x x 实际上可以看做是一个随机数,那么对应的 c i = a i − x c_i=a_i-x ci=ai−x 没有出现过的概率为 n − i + 1 n \frac{n-i+1}{n} nn−i+1,于是对于 i i i 构造的期望递归次数为 n n − i + 1 \frac{n}{n-i+1} n−i+1n。那么总时间复杂度期望为 O ( n log n ) O(n\log n) O(nlogn)。