CF264B Good Sequences
题意
给定一个单调上升序列 ,求最多在这个序列中选多个数(不要求相邻),满足相邻两个数不互质。
解法
显然有一个 的 DP,会超时。
考虑 这个式子,事实上就是 有共同公因数,那么对于每一个 ,只需要把 分解质因数,在所有质因数里找一个相对应 中最大的, 即可。
代码:
#pragma GCC optimize("-Ofast,inline")
#include <iostream>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int N = 1e5 + 5;
int a[N], n, dp[N], ans = 0;
inline vector<int> calc(register int x)
{
vector<int> res;
int rem = x;
for (register int i = 2; i * i <= rem; ++i)
{
bool f = false;
while (x % i == 0)
{
x /= i;
f = true;
}
if (f) res.push_back(i);
}
if (x != 1)
{
res.push_back(x);
}
return res;
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)
{
vector<int> x = calc(a[i]);
int s = x.size() - 1, maxn = 0;
for (int i = 0; i <= s; i++)
{
maxn = max(maxn, dp[x[i]]);
}
for (int i = 0; i <= s; i++)
{
dp[x[i]] = max(dp[x[i]], maxn + 1);
}
ans = max(ans, maxn + 1);
}
printf("%d\n", ans);
return 0;
}

浙公网安备 33010602011771号