Longest Subsequence

题目可以转换成求哪个数的因数出现次数最多,并输出这些因数的位置,所以也可以用埃氏筛的思想,这样可以避免重复计算。用一个数组sum[]来记录总次数,index就是具体的那个数,因为m<=1e6,所以数组是可以开出来的,每遇到一个数,就把sum中index为这个数的倍数的位置都++,因为一个数肯定是它倍数的因数。并且用结构体来存储数组,最后每个数的编号也都可以找到的。
`#include<stdio.h>

include

include

include<stdlib.h>

include<string.h>

include

include

using namespace std;

const int N = 1e6 + 7;

struct st {
int id;
int a;
} lst[N];

int cnt[N] = { 0 };
int sum[N] = { 0 };
int index[N] = { 0 };

int main() {
int n, m;
scanf_s("%d %d", &n, &m);
for (int i = 0;i < n;i++) {
scanf_s("%d", &lst[i].a);
lst[i].id = i + 1;
if (lst[i].a <= m) {
cnt[lst[i].a]++;
}
}
sort(lst, lst + n, [](const st& a, const st& b) {
return a.a < b.a;
});
int p = 0;
while (lst[p].a <= m&&p<n) {
for (int i = lst[p].a;i <= m;i += lst[p].a) {
sum[i] += cnt[lst[p].a];
}
p += cnt[lst[p].a];
}
int max = 0;
for (int i = 1;i <= m;i++) {
if (sum[i] > sum[max]) {
max = i;
}
}
if (max == 0) {
printf("%d %d", 1, 0);
return 0;
}
printf("%d %d\n", max, sum[max]);
for (int i = 0;i < n;i++) {
if (max % lst[i].a == 0) {
index[lst[i].id] = 1;
}
if (lst[i].a > m) break;
}
for (int i = 1;i <= n;i++) {
if (index[i] == 1) {
printf("%d ", i);
}
}
return 0;
}`

posted @ 2025-02-10 20:40  十柒*  阅读(6)  评论(0编辑  收藏  举报