2026/1/20 22:15:20
网站建设
项目流程
重庆网站设计找重庆最佳科技,东营网站建设费用,网站是com好点还是cn,威海网站建设哪一家题目描述
给定有 n 个元素的数组 a 和数字 m。记 LCM 为 l 。找出使 l≤m 的 a 的最长子序列。
定义 a 的子序列为通过删除 a 中的一些元素得到的数组。允许删除 0 个元素或所有元素。
空数组的 LCM 等于 1。
输入格式
第一行包含两个整数 n 和 m ( 1≤n,m≤106 ) — 数组…题目描述给定有 n 个元素的数组 a 和数字 m。记 LCM 为 l 。找出使 l≤m 的 a 的最长子序列。定义 a 的子序列为通过删除 a 中的一些元素得到的数组。允许删除 0 个元素或所有元素。空数组的 LCM 等于 1。输入格式第一行包含两个整数 n 和 m ( 1≤n,m≤106 ) — 数组 a 的大小和题目描述中的参数。第二行包含 n 个整数 ai ( 1≤ai≤109 ) — a 的元素。输出格式第一行打印两个整数 l 和 kmax ( 1≤l≤m,0≤kmax≤n ) — LCM 的值和最优子序列中的元素数量。第二行打印 kmax 个整数 — 按升序排序输出元素。请注意您可以找到并打印任何具有最大长度的子序列。显示翻译题意翻译输入输出样例输入 #1复制7 8 6 2 9 2 7 2 3输出 #1复制6 5 1 2 4 6 7输入 #2复制6 4 2 2 2 3 3 3输出 #2复制2 3 1 2 3代码实现#include iostream #include vector #include set #include algorithm using namespace std; const int mx 1000005; int ct[mx]; vectorint vec[mx]; void writeln(int val) { cout val endl; } int main() { int n, m; cin n m; for (int i 1; i n; i) { int x; cin x; if (x m) vec[x].push_back(i); } for (int i 1; i m; i) for (int j 1; i * j m; j) ct[i * j] vec[i].size(); int p max(int(max_element(ct 1, ct m 1) - ct), 1); setint res; // 替换auto为vector迭代器 for (int i 1; i p; i) { if (p % i 0) { for (vectorint::iterator it vec[i].begin(); it ! vec[i].end(); it) { res.insert(*it); } } } cout p ; writeln(res.size()); bool f true; // 替换auto为set迭代器 for (setint::iterator it res.begin(); it ! res.end(); it) { if (!f) cout ; f false; cout *it; } if (!res.empty()) cout endl; return 0; }