【XSY4371】star(构造)

该博客讨论了一种在给定序列条件下构造新序列的问题,涉及数学中的同余方程。当序列元素数量小于或等于n时,存在解的充要条件被给出,并提供了一个递归构造算法来证明充分性。算法通过逐位构造并调整,确保新序列满足条件。复杂度分析表明算法在期望情况下运行时间为O(nlogn)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

给定值域在 [ 0 , n − 1 ] [0,n-1] [0,n1] 的序列 a 1 , ⋯   , a m a_1,\cdots,a_{m} a1,,am,要求构造值域在 [ 0 , n − 1 ] [0,n-1] [0,n1] 的序列 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+ciai(modn)

n ≤ 1 0 5 n\leq 10^5 n105

题解:

首先说明有解的充要条件:

  • 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 ai0(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=aix

此时若 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+v3aj1t2+v2t2+v4aj2t3+v3t3+v5aj3t1+v4v2=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 ai0(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=aix 没有出现过的概率为 n − i + 1 n \frac{n-i+1}{n} nni+1,于是对于 i i i 构造的期望递归次数为 n n − i + 1 \frac{n}{n-i+1} ni+1n。那么总时间复杂度期望为 O ( n log ⁡ n ) O(n\log n) O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值