Solution -「ARC 123F」Insert Addition
大约是翻译了一下官方题解?
§ @Description@
对于一个整数序列 P=(P1,…,Pm),定义 f(P) 为一个序列 Q 满足:
- Qi=Pi+Pi+1,其中 i∈[1,m);
- f(P)=(P1,Q1,…,Pm−1,Qm−1,Pm)。
给出正整数 a,b,N,其中 a,b⩽N,令序列 A=(a,b),令序列 B 为一下操作的结果:
- 做 N 次令 A=f(A).
- 删除 A 中大于 B 的数。
求 Bl,…r。
§ @Solution@
∆ ◆ The Coefficient Sequence
构造最终的 A 序列的过程是这样的:
a,ba,a+b,ba,2a+b,a+b,a+2b,ba,3a+b,2a+b,3a+2b,a+b,2a+3b,a+2b,a+3b,b…
可以发现有对称性。此时我们先不关心 a,b 以及 N 的大小,反之,我们来观察其序列系数,也就是把每个元素看成 xa+yb,其系数的 (x,y),上例的序列系数即
(1,0),(0,1)(1,0),(1,1),(0,1)(1,0),(2,1),(1,1),(1,2),(0,1)(1,0),(3,1),(2,1),(3,2),(1,1),(2,3),(1,2),(1,3),(0,1)…
以下我们称其为 Coefficient Sequence。
∆ ◆ The properties of the Coefficient Sequence
现在我们来观察 Coefficient Sequence 的性质。
Observation 1:在 Coefficient Sequence 中相邻的两个二元组 (xS,yS),(xT,yT),都有: xSyT−xTyS=1。
使用数学归纳法(induction)即证。
Observation 2:对于两个 两个二元组 (xS,yS),(xT,yT),如果他们满足 xSyT−xTyS=1,那么它们在 Coefficient Sequence 中相邻,即 Observation 1 是充要条件。
不会证,大概意会一下吧。
Observation 3:对于一个二元组 (x,y),如果 gcd(x,y)=1,那么 (x,y) 会出现在 Coefficient Sequence 中。
比较显然,以至于官方题解没有给出证明。
Observation 4:在任意时刻,所有在 Coefficient Sequence 中的 (x,y) 总是呈从左到右的关于值 xy 递增(令 0x=∞)。
∆ ◆ The sequence B in other words
现在描述序列 B 变得更加容易,现在我们这样描述它:
对于所有二元组 (x,y) 满足 x,y,s.t.x,y∈N,gcd(x,y)=1,ax+by⩽N,我们对其按 xy 排序后形成一个二元组序列 {(xi,yi)},则 Bi=axi+byi。
∆ ◆ Computing Bn
现在我们来考虑原问题的简化版,我们来计算 Bn。让我们把这个描述成一个计数问题(通过二分 xy):
给定正整数 a,b,N,以及一个有理数 c(二分的值),求二元组 (x,y)=(0,0) 的数量,其中 (x,y) 满足
- ax+by⩽N;
- gcd(x,y)=1;
- xy⩽c。
我们令 F(N) 为以上问题的答案,同时令 G(N) 为去掉 gcd(x,y)=1 限制的答案。G(N) 的式子可以很方便的写出来: G(N)=∑y=1Nmax{⌊aN−by⌋−⌊cy⌋+1,0},同时我们还可以写出 G(N)=∑d=1NF(⌊dN⌋)。那么再根据 Möbius inversion formula,我们可以表示出 F(N)=∑d=1Nμ(d)G(⌊dN⌋)。于是计算该问题答案的复杂度就是 O(N)。
但是此时我们知道了 Bn 的 xnyn,怎么知道 (xn,yn) 呢?我们可以再做一个二分。观察出这样一个规律:若令 l=(1,0),r=(0,1),那么中间位置就是 l+r。于是我们可以再次做一个二分,利用 xy 单调来做 check。
顺带一提,这个还可以使用 类欧几里得 来计算。
∆ ◆ Computing Bl,…,r
可以发现这个东西可以知二求一,于是求出 Bl,Bl+1 就行了。当然也可以求出 Bl,Br 然后做二分搜索。