Codeforces 632D Longest Subsequence 水题

本文介绍了一种算法,用于解决给定序列中寻找元素个数最多的子集问题,要求子集中所有数字的最小公倍数不超过特定值M。通过保存小于等于M的数字及其下标,利用调和级数复杂度处理,找到满足条件的子集,并输出其下标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

题意

给 一 个 序 列 , 求 一 个 元 素 个 数 最 多 的 子 集 , 里 面 所 有 数 字 的 最 小 公 倍 数 不 超 过 m . 按 照 下 标 从 小 到 大 的 顺 序 输 出 任 何 一 个 . 给一个序列,求一个元素个数最多的子集,里面所有数字的最小公倍数不超过m.\newline按照下标从小到大的顺序输出任何一个. ,,m..

题解

水题.不会做真是锅大了.
首先一看数据范围, 1 0 9 10^9 109.哎呦我去,怎么做.
m ≤ 1 0 6 . m\leq10^6. m106.
哎呦我去,辣鸡.
首先把小于或者等于 m m m的数字和它的下标保存下来.
我们定义 c n t [ i ] cnt[i] cnt[i] a a a数组里 i i i的约数出现的个数.
我们可以轻松地把 c n t cnt cnt数组在调和级数复杂度内处理出来.
接下来取出来的最大值就是 c n t cnt cnt数组的最大值,此时取出来的所有数字的最小公倍数就是最大值的下标.
最后扫一遍把所有能整除最大值下标的数字下标输出即可.
谢谢大家.

#include<bits/stdc++.h> //Ithea Myse Valgulious
using namespace std;
const int yuzu=1e6;
typedef int fuko[yuzu|10];
fuko a,b,cnt;
int main(){
int n,m,i,x,top=0,j;
for (read(n),read(m),i=1;i<=n;++i) 
  if ((x=read())<=m) ++cnt[a[++top]=x],b[top]=i;
for (n=top,i=m;i;--i)
  for (j=i<<1;j<=m;j+=i) cnt[j]+=cnt[i];
int llx=-1,p;
for (i=1;i<=m;++i) if (cnt[i]>llx) llx=cnt[i],p=i;
write(p),p32,write(llx),pl;
for (i=1;i<=n;++i) if (p%a[i]==0) write(b[i]),p32;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值