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