看到大家都是用 f i f_i fi 来存储枚举到 i i i 的答案,这里再来一种别样的方法。
同样得先枚举 a i a_i ai 的约数,我们其实不需要存储 a i a_i ai , 边读边算即可。
我们用 m a i ma_i mai 存储约数为 i i i 的最大答案数量,每次先遍历出 a i a_i ai 约数的最大 m a i ma_i mai 为 a n s i ans_i ansi , 并用 vector 存储约数,最后将每个 m a i ma_i mai = a n s i + 1 ans_i + 1 ansi+1 即可。
下面给出代码 − − > --> −−>
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <vector>
#include <cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
inline int read(){
int x=0,w=0;char ch=getchar();
while (!isdigit(ch))w|=ch=='-',ch=getchar();
while (isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return w?-x:x;
}
vector <int> vec[500006];
int n, l, a[50005], ma[1000006], ans[50005], anss;
int main(){
n = read();
l = read();
for(int i = 1; i <= n; i++){
int j;
j = read();
int m = sqrt(j);
for(int x = 1; x <= m; x++){
if(j % x == 0){
int y = j / x;
if(x >= l){
vec[i].push_back(x);
ans[i] = max(ans[i], ma[x]);
}
if(x != y && y >= l){
vec[i].push_back(y);
ans[i] = max(ans[i], ma[y]);
}
}
}
anss = max(anss, ans[i] + 1);
for(int j = 0; j < vec[i].size() ; j++){
ma[vec[i][j]] = ans[i] + 1;
}
}
printf("%d",anss);
return 0;
}
完结撒花✿✿ヽ(°▽°)ノ✿