CF1034A 题解

CF1034A

思路

先对 aigcdg 表示数组的 gcd

每个 ai 除以 g。要找出一个质数,使得有最多的除以 g 后的 ai 整除该质数。对 ai 做质因数分解,舍去重复的质数因子,加入桶中。最后枚举答案 ans=minntinti 即要删除的数的个数。

maxai 内的质数做素数筛,复杂度 O(ai)。在素数筛向后转移的同时,标记 visi×prej1 时,记录 fi×prej=prej,即 i×prej 有一个质因数 prej。对 x 做质因数分解时,x 不断除以 fx 直到 x=1。在分解过程中,所有的 fxx 的质因数。因为 ai 最多有 logai 质因子,所以总复杂度 O(nlogai+ai),可以接受。

code

int n,a[maxn],g,ans=inf,mx;
bool vis[maxm];
int pre[maxn],cnt;
int f[maxm],t[maxm];
void s(int n){
	for(int i=2;i<=n;i++){
		if(!vis[i]){
			pre[++cnt]=i;
			f[i]=i;
		}
		for(int j=1;j<=cnt&&i*pre[j]<=n;j++){
			f[i*pre[j]]=pre[j];
			vis[i*pre[j]]=1;
			if(i%pre[j]==0)break;
		}
	}
}

signed main(){
	n=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
		if(i==1)g=a[1];
		else g=__gcd(g,a[i]);
	}
	for(int i=1;i<=n;i++){
		a[i]/=g;
		mx=max(mx,a[i]);
	}
	s(mx);
	for(int i=1;i<=n;i++){
		int lst=0;
		while(a[i]!=1){
			if(lst!=f[a[i]]){
				lst=f[a[i]];
				t[lst]++;
			}
			a[i]/=f[a[i]];
		}
	}
	for(int i=1;i<=mx;i++)ans=min(ans,n-t[i]);
	if(ans==n)printf("-1\n");
	else printf("%d\n",ans); 
}
posted @   yhddd  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示