1. 3-SUM

1.1 问题描述

Given three sets \(X\), \(Y\), and $Z $ of \(n\) integers each, determine whether there is a triple \(i \in X, j \in Y, k \in Z\) such that \(i + j = k\).

给定三个包含\(n\)个整数的集合, 每个整数的值都在\(0\)\(m\)之间, 判断是否有一个三元组\((i, j, k)\)满足\(i \in X, j \in Y, k \in Z\)并且\(i + j = k\).

1.2 解答

算法如下:

  • 构造多项式:
\[A(x)=a_0x+a_1x+\dots+a_mx^m
\]

\[B(x)=b_0x+b_1x+\dots+b_mx^m
\]

其中\(a_i=1\) 当且仅当\(i \in X\)否则\(a_i=0\), \(b_j=1\) 当且仅当\(j \in Y\)否则\(b_j=0\).

  • 计算\(C(x)=A(x)\times B(x)\). (利用FFT)
  • 多项式\(C(x)\)系数\(c_k\)表示集合\(\set{(i, j)|i\in X,j \in Y, i+j=k}\)的大小, 即选择一个整数\(i \in X\)和一个整数\(j\in Y\), 使得他们的和为\(k\)的方法数.
  • 对于每一个\(k\in Z\), 判断\(c_k\)是否大于\(0\), 如果存在一个\(k\)满足条件, 说明可以找到一个三元组\((i, j, k)\)满足\(i \in X, j \in Y, k \in Z\)并且\(i + j = k\).

时间复杂度: FFT需要\(O(m\log m)\), 遍历\(Z\)需要\(O(n)\), 总共\(O(m\log m+n)\).

2. 等距下标

2.1 问题描述

长度为\(n\)的二进制串\(A\)的一组等距下标\((i,j,k)\)满足如下条件:

  • \(0\leq i <j<k\leq n-1\),
  • \(A[i]=A[j]=A[k]=1\),
  • \(k-j=j-i\).

(a) 设计⼀个\(O(n\log n)\)的算法,计算\(A\)中是否存在等距下标.

(b) 设计⼀个\(O(n\log n)\)的算法,计算\(A\)中有多少组等距下标.

2.2 解答

(a) 算法如下:

  • 构造多项式:
\[A(x)=a_0x+a_1x+\dots+a_{n-1}x^{n-1}
\]

其中系数\(a[t]=A[t]\).

  • 计算\(B(x)=A(x)\times A(x)\). (利用FFT)
  • 多项式\(B(x)\)的系数\(b_l\)表示集合\(\set{(p, q)|p,q\in [0,n-1], A[p]=A[q]=1, p+q=l}\)的大小, 即有多少组下标\(p\)和下标\(q\), 满足\(A[p]=A[q]=1\)\(p+q=l\).
  • 判断是否存在\(b_l=2r+1\), 其中\(b_l\)为多项式\(B(x)\)的系数, \(r=1,2,3,\dots\), 如果存在说明存在等距下标.

等距下标\((i, j, k)\)满足\(i+k=2j\), 多项式\(B(x)\)中, \(b_lx{^l}\)表示和为\(l\)且对应位置为1的下标有\(b_l\)组. 所以当\(b_l\)为大于等于3的奇数时, 一定存在等距下标.

*为什么要求为奇数? 为了保证有\(i, j, k\)中的\(j\), 只有和为\(l\)的下标有奇数组,才能保证\(b_l\)组中一定有一组下标为\((j, j)\), 此时才能保证一定有\(i+k=2j\), 即存在等距下标.

(b)

在(a)的基础上, 只需遍历\(B(x)\)的系数, 如果\(b_l\)为大于等于3的奇数, 则最终结果需要加\(\lfloor \frac{b_l}{2} \rfloor\).

未完待续...