有两个数列 a , b a,b a,b,定义如下。已知数列 a a a有一个性质:对于任意的正整数 x x x,存在唯一的整数对 ( p , q ) (p,q) (p,q),满足 a q − a p = x a_q-a_p=x aq−ap=x。现在有 n n n个询问,每个询问给出一个正整数 x i x_i xi,求出与之对应的整数对 ( p i , q i ) (p_i,q_i) (pi,qi)(先输出 q i q_i qi,后输出 p i p_i pi)。
a n = { n n ⩽ 2 2 a n − 1 n > 2 , n m o d 2 = 1 a n − 1 + b n − 1 n > 2 , n m o d 2 = 0 b n = mex { ∣ a i − a j ∣ ∣ 1 ⩽ i , j ⩽ n } \begin{aligned} a_n&=\begin{cases} n&n\leqslant 2\\ 2a_{n-1}&\text{$n>2$, $n\mod 2=1$}\\ a_{n-1}+b_{n-1}&\text{$n>2$, $n\mod 2=0$} \end{cases}\\ b_n&=\text{mex}\lbrace\vert a_i-a_j\vert\vert1\leqslant i,j\leqslant n\rbrace \end{aligned} anbn=⎩⎪⎨⎪⎧n2an−1an−1+bn−1n⩽2n>2, nmod2=1n>2, nmod2=0=mex{ ∣ai−aj∣∣1⩽i,j⩽n}
n ⩽ 250000 n\leqslant 250000 n⩽250000, x i ⩽ 1 0 9 x_i\leqslant 10^9 xi⩽109。
这是一道非常奇葩的题目。首先暴力打表方便找规律:
n n n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | … |
---|---|---|---|---|---|---|---|---|---|
a n a_n an | 1 | 2 | 4 | 8 | 16 | 21 | 42 | 51 | … |
b n b_n bn | 1 | 2 | 4 | 5 | 5 | 9 | 9 | 10 | … |
n n n | … | 53 | 54 | 55 | 56 | 57 | … |
---|---|---|---|---|---|---|---|
a n a_n an | … | 531141824 | 531141876 | 1062283752 | 1062283805 | 2124567610 | … |
b n b_n bn | … | 52 | 53 | 53 | 54 | 54 | … |
注意到数列 a a a的递推式中有 a n = 2 a n − 1 a_n=2a_{n-1} an=2an−1的部分,这意味着 a n a_n an增长得特别快,第60项以前就超过了 1 0 9 10^9 109。因此确定一个界限 N N N,让该界限内 a n a_n an的值不至于远远超过 1 0 9 10^9 109。先暴力计算 a , b a,b a,b数列的前 N N N项,统计可能出现的 a q − a p a_q-a_p aq−ap的值,并记下与之对应的数对 ( p , q ) (p,q) (p,q),时间复杂度 O ( N 2 ) O(N^2) O(N2)。
若在刚才的暴力计算中出现了询问的 x x x,说明 a q , a p a_q,a_p aq,ap都比较小,直接输出对应的数对作为答案。下面讨论 a p , a q a_p,a_q ap,aq都特别大(远大于 1 0 9 10^9 109)的情况:
经过上述讨论发现,若 a p , a q a_p,a_q ap,aq特别大,答案 ( p , q ) (p,q) (p,q)一定满足 q q q为偶数, b p = x b_p=x bp=x,且 q − p = 1 q-p=1 q−p=1。于是问题变成了已知 b p b_p bp的值,求 b p b_p bp的下标 p p p。下面观察数列 b b b:
所以 b b b数列靠后的项都是相邻两项相同,但大多数时候每次增加 1 1 1,有的时候增加的值超过 1 1 1。后者发生在 n n n为偶数时,集合中出现了 b n − 1 b_{n-1} bn−1,但集合中可能原来就有 b n − 1 + 1 b_{n-1}+1 bn−1+1。这个 b n − 1 + 1 b_{n-1}+1 bn−1+1在添加进集合的时候一定是远大于当时集合中的最大元素的(否则 b n − 1 b_{n-1} bn−1早就应该出现),也就是说 b n − 1 + 1 b_{n-1}+1 bn−1+1是在之前 n n n为某个奇数时添加的。而由上文可知,此时添加的 b n − 1 + 1 b_{n-1}+1 bn−1+1就是数列 a a a中的某一项。又因为 b n − 1 + 1 < b n ⩽ 1 0 9 b_{n-1}+1
鉴于 b b b数列在第偶数项会发生变化,将 N N N设为奇数。假设 b b b数组靠后的项每次增加 1 1 1,有 b p = b N + p − N 2 b_p=b_N+\frac{p-N}2 bp=bN+2p−N。但在数列 a a a的前 N N N项中可能已经出现了 ( b N , b p ) (b_N,b_p) (bN,bp)内的值,每一个这样的值都会导致 b b b数列在某一项多增加 1 1 1。二分查找求出这样的值的个数 c n t cnt cnt,于是
b p = b N + p − N 2 + c n t b_p=b_N+\frac{p-N}2+cnt bp=bN+2p−N+cnt
将 b p = x b_p=x bp=x代入,解得
p = 2 ⋅ ( x − b N − c n t ) + N p=2\cdot(x-b_N-cnt)+N p=2⋅(x−bN−cnt)+N