题意
题解
设
g
c
d
(
b
i
,
b
j
)
=
d
,
b
i
=
a
d
,
b
j
=
b
d
,
a
<
b
gcd(b_i,b_j)=d,b_i=ad,b_j=bd,a<b
gcd(bi,bj)=d,bi=ad,bj=bd,a<b,则有
a
d
+
b
d
+
d
=
a
b
d
ad+bd+d=abd
ad+bd+d=abd 即
a
+
b
+
1
=
a
b
a+b+1=ab
a+b+1=ab 将式子变形得到
(
a
−
1
)
(
b
−
1
)
=
2
(a-1)(b-1)=2
(a−1)(b−1)=2 得到解
a
=
2
,
b
=
3
a=2,b=3
a=2,b=3。那么满足条件的序列按照值域排序去重后,一定满足
b
i
=
2
3
b
i
+
1
b_i=\frac{2}{3}b_{i+1}
bi=32bi+1。使
a
a
a 有序,设
d
p
[
i
+
1
]
dp[i+1]
dp[i+1] 为以
a
i
a_i
ai 结尾的满足条件的序列和的最大值,则有递推
d
p
[
i
+
1
]
=
max
{
A
[
i
]
d
p
[
i
]
+
A
[
i
]
A
[
i
−
1
]
=
A
[
i
]
d
p
[
k
+
1
]
+
A
[
i
]
3
∣
A
[
i
]
,
且
k
为
满
足
A
[
k
]
=
A
[
i
]
/
3
∗
2
的
最
大
值
dp[i+1]=\max\begin{cases} A[i] & \\ dp[i]+A[i] & A[i-1]=A[i]\\ dp[k+1]+A[i] & 3\vert A[i],且k为满足A[k]=A[i]/3*2的最大值 \end{cases}
dp[i+1]=max⎩⎪⎨⎪⎧A[i]dp[i]+A[i]dp[k+1]+A[i]A[i−1]=A[i]3∣A[i],且k为满足A[k]=A[i]/3∗2的最大值
#include <bits/stdc++.h>
using namespace std;
#define rep(i, l, r) for (int i = l, _ = r; i < _; ++i)
typedef long long ll;
const int maxn = 300005;
int N, A[maxn];
ll Res, dp[maxn];
unordered_map<int, int> maxId;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> N;
rep(i, 0, N) cin >> A[i];
sort(A, A + N);
dp[0] = 0;
rep(i, 0, N)
{
ll res = 0;
if (i && A[i - 1] == A[i])
res = max(res, dp[i]);
if (A[i] % 3 == 0 && maxId.count(A[i] / 3 * 2))
res = max(res, dp[maxId[A[i] / 3 * 2] + 1]);
dp[i + 1] = (res += A[i]);
Res = max(Res, res);
maxId[A[i]] = i;
}
cout << Res << '\n';
}