【题目】NKOJ-4247 老蒋的数列

题目大意

有两个数列 a , b a,b ,定义如下。已知数列 a a 有一个性质:对于任意的正整数 x x ,存在唯一的整数对 ( p , q ) (p,q) ,满足 a q a p = x a_q-a_p=x 。现在有 n n 个询问,每个询问给出一个正整数 x i x_i ,求出与之对应的整数对 ( p i , q i ) (p_i,q_i) (先输出 q i q_i ,后输出 p i p_i )。

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}

n 250000 n\leqslant 250000 x i 1 0 9 x_i\leqslant 10^9


思路

这是一道非常奇葩的题目。首先暴力打表方便找规律:

n n 1 2 3 4 5 6 7 8
a n a_n 1 2 4 8 16 21 42 51
b n b_n 1 2 4 5 5 9 9 10
n n 53 54 55 56 57
a n a_n 531141824 531141876 1062283752 1062283805 2124567610
b n b_n 52 53 53 54 54

注意到数列 a a 的递推式中有 a n = 2 a n 1 a_n=2a_{n-1} 的部分,这意味着 a n a_n 增长得特别快,第60项以前就超过了 1 0 9 10^9 。因此确定一个界限 N N ,让该界限内 a n a_n 的值不至于远远超过 1 0 9 10^9 。先暴力计算 a , b a,b 数列的前 N N 项,统计可能出现的 a q a p a_q-a_p 的值,并记下与之对应的数对 ( p , q ) (p,q) ,时间复杂度 O ( N 2 ) O(N^2)

若在刚才的暴力计算中出现了询问的 x x ,说明 a q , a p a_q,a_p 都比较小,直接输出对应的数对作为答案。下面讨论 a p , a q a_p,a_q 都特别大(远大于 1 0 9 10^9 )的情况:

  • q q 为偶数时,
    • q p = 1 q-p=1 ,有 a q = a p + b p a_q=a_p+b_p ,即 a q a p = b p a_q-a_p=b_p
    • q p = 2 q-p=2 ,有 a q = a p + 1 + b p + 1 = 2 a p + b p + 1 a_q=a_{p+1}+b_{p+1}=2a_p+b_{p+1} ,即 a q a p = a p + b p + 1 a_q-a_p=a_p+b_{p+1} ,与 x 1 0 9 x\leqslant 10^9 矛盾,排除。
    • q p > 2 q-p>2 a q a p a_q-a_p 的值只会更大,排除。
  • q q 为奇数时,
    • q p = 1 q-p=1 ,有 a q = 2 a p a_q=2a_p ,即 a q a p = a p a_q-a_p=a_p ,与 x 1 0 9 x\leqslant 10^9 矛盾,排除。
    • q p 2 q-p\geqslant 2 ,跟 q q 为偶数的情况类似,均排除。

经过上述讨论发现,若 a p , a q a_p,a_q 特别大,答案 ( p , q ) (p,q) 一定满足 q q 为偶数, b p = x b_p=x ,且 q p = 1 q-p=1 。于是问题变成了已知 b p b_p 的值,求 b p b_p 的下标 p p 。下面观察数列 b b

  • n n 为偶数时,有 a n = a n 1 + b n 1 a_n=a_{n-1}+b_{n-1} 。此时集合 { a i a j 1 i , j n } \lbrace\vert a_i-a_j\vert\vert1\leqslant i,j\leqslant n\rbrace 中出现了 a n a n 1 = b n 1 \vert a_n-a_{n-1}\vert=b_{n-1} ,因此一定有 b n > b n 1 b_n>b_{n-1}
  • n n 为奇数时,有 a n = 2 a n 1 a_n=2a_{n-1} 。此时集合 { a i a j 1 i , j n } \lbrace\vert a_i-a_j\vert\vert1\leqslant i,j\leqslant n\rbrace 中新添加的最小元素为 a n a n 1 = a n 1 a_n-a_{n-1}=a_{n-1} ,而该元素比原来集合中的最大元素 a n 1 a n 2 a_{n-1}-a_{n-2} 还要大得多,因此该集合的 mex \text{mex} 值不变,即 b n = b n 1 b_n=b_{n-1}

所以 b b 数列靠后的项都是相邻两项相同,但大多数时候每次增加 1 1 ,有的时候增加的值超过 1 1 。后者发生在 n n 为偶数时,集合中出现了 b n 1 b_{n-1} ,但集合中可能原来就有 b n 1 + 1 b_{n-1}+1 。这个 b n 1 + 1 b_{n-1}+1 在添加进集合的时候一定是远大于当时集合中的最大元素的(否则 b n 1 b_{n-1} 早就应该出现),也就是说 b n 1 + 1 b_{n-1}+1 是在之前 n n 为某个奇数时添加的。而由上文可知,此时添加的 b n 1 + 1 b_{n-1}+1 就是数列 a a 中的某一项。又因为 b n 1 + 1 < b n 1 0 9 b_{n-1}+1<b_n\leqslant 10^9 ,所以数列 a a 中的这一项是包含在最开始暴力计算的前 N N 项当中的。

鉴于 b b 数列在第偶数项会发生变化,将 N N 设为奇数。假设 b b 数组靠后的项每次增加 1 1 ,有 b p = b N + p N 2 b_p=b_N+\frac{p-N}2 。但在数列 a a 的前 N N 项中可能已经出现了 ( b N , b p ) (b_N,b_p) 内的值,每一个这样的值都会导致 b b 数列在某一项多增加 1 1 。二分查找求出这样的值的个数 c n t cnt ,于是

b p = b N + p N 2 + c n t b_p=b_N+\frac{p-N}2+cnt

b p = x b_p=x 代入,解得

p = 2 ( x b N c n t ) + N p=2\cdot(x-b_N-cnt)+N

发布了26 篇原创文章 · 获赞 13 · 访问量 4880

猜你喜欢

转载自blog.csdn.net/PHenning/article/details/104352972