[题解]CF1475G Strange Beauty
题目大意:有 个数,从中挑选一个最大的子集,使得集合中任意两个不同的数 , 有 或
我们发现,集合中必然存在一个数 ,使得集合中其他数都是 的因数
所以我们只需统计每个数的因数在原数组里的出现次数即可
这里 ,可以预处理出每个数的因数
代码:
#include<bits/stdc++.h>
#define rep(i,a,b) for (register int i=(a);i<=(b);i++)
#define drep(i,a,b) for (register int i=(a);i>=(b);i--)
typedef long long ll;
using namespace std;
inline ll read()
{
ll sum=0,f=0;char c=getchar();
while (!isdigit(c)) f|=(c=='-'),c=getchar();
while (isdigit(c)) sum=(sum<<1)+(sum<<3)+(c^48),c=getchar();
return f?-sum:sum;
}
const int N=200010;
int n,a[N],f[N],cnt[N];
vector<int>fac[N];
inline void init(int size)
{
rep(i,1,size)
{
int x=i<<1;
while (x<=size) fac[x].push_back(i),x+=i;
}
}
inline void solve()
{
memset(cnt,0,sizeof(cnt)),memset(f,0,sizeof(f));
int mx=0;
n=read();rep(i,1,n) a[i]=read(),cnt[a[i]]++,mx=max(mx,a[i]);
int ans=n;
rep(i,1,mx) if (cnt[i])
{
f[i]=cnt[i];
rep(j,0,(int)fac[i].size()-1)
{
if (cnt[fac[i][j]]) f[i]=max(f[i],f[fac[i][j]]+cnt[i]);
}
ans=min(ans,n-f[i]);
}
cout<<ans<<endl;
}
int main()
{
init(N-10);
drep(T,read(),1) solve();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端