首页 > 其他分享 >【题解】CF364D

【题解】CF364D

时间:2023-03-12 19:44:06浏览次数:37  
标签:约数 return int 题解 CF364D ansn getchar

题目大意

给定集合a,求最大的是大小超过一半的子集的最大公约数的数是什么。

题解

“超过一半”即想到随机化n次后只有\(\frac{1}{2^n}\)的几率错误,于是随机一个数判断它的约数是否是一半以上的数的约数。
一个数的约数个数大约是\(n^{\frac{1}{3}}\)的,直接枚举每个约数时间不可行,不能从“约数能被多少个数整除”于是想到“每个数与当前数的最大公约数处贡献”,从大到小累加一下即可。

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int rd(){
	int f=1,j=0;
	char w=getchar();
	while(!isdigit(w)){
		if(w=='-')f=-1;
		w=getchar();
	}
	while(isdigit(w)){
		j=j*10+w-'0';
		w=getchar();
	}
	return f*j;
}
const int N=1000010;
mt19937 rnd(20060309);
int T=10;
int n,ans=1,sum[N],d[N],f[N],cnt;
int gcd(int x,int y){return (!y)?x:gcd(y,x%y);}
int deal(int t){
	cnt=0;
	for(int i=2;i*i<=t;i++){
		if(t%i==0){
			d[++cnt]=i;
			if(i*i!=t)d[++cnt]=t/i;
		}
	}
	d[++cnt]=t;
	sort(d+1,d+1+cnt);
	for(int i=1;i<=cnt;i++)f[i]=0;
	for(int i=1;i<=n;i++){
		int g=gcd(sum[i],t);
		if(g!=1)f[lower_bound(d+1,d+1+cnt,g)-d]++;
	}
	for(int i=1;i<=cnt;i++){
		for(int j=i+1;j<=cnt;j++)if(d[j]%d[i]==0)f[i]+=f[j];
	}
//	cout<<"T:"<<t<<"\n";
//	for(int i=1;i<=cnt;i++)cout<<d[i]<<":"<<f[i]<<"\n";
	int ansn=0;
	for(int i=cnt;i>=1&&!ansn;i--)if(f[i]*2>=n)ansn=d[i];
	return ansn;
}
signed main(){
	n=rd();
	for(int i=1;i<=n;i++)sum[i]=rd();
	while(T--)ans=max(deal(sum[rnd()%n+1]),ans);
	printf("%lld\n",ans);
	return 0;
}

标签:约数,return,int,题解,CF364D,ansn,getchar
From: https://www.cnblogs.com/T-water/p/17208893.html

相关文章

  • 题解 P3306 [SDOI2013] 随机数生成器
    Link它\(p\)都是质数了,这不就明示我们是bsgs了吗我没看出来然后我们来倒一下\(n\)天的式子第一天是\(x_1\),第二天是\(ax_1+b\),第三天是\(a^2x_1+(ab+b)\),第四......
  • 【题解】CF1264D2
    题目大意给定一个长度为\(n\)的字符串,其中只有(,),?三种字符,其中?可以为(或者)对于一个括号序列,定义其权值为其通过删除字符后可以得到的合法的括号匹配的最深的深度,下......
  • AcWing 199. 余数之和 题解
    做了一下午……题解都看不懂,最后自己比比划划弄懂了。题意:给出\(n,k\),求\(\sum\limits_{i=1}^nk\modi\)。首先取模形式十分不好处理,所以我们可以根据取模运算定义做......
  • windows 文件夹打开默认是小窗口问题解决
    目录windows文件夹打开默认是小窗口问题解决问题解决windows文件夹打开默认是小窗口问题解决不知道误操作了什么,最近点击windows文件夹默认打开的都是小窗口,每次需要点......
  • 3 月 8 日测试题解
    3月8日测试题解T1题意给你一张图\(G=(V,E)\),\(|V|=n\),\(|E|=m\),带边权、点权。你可以执行以下操作任意多次:选取一个顶点,将其自身与与其相连的边删去当你......
  • 2023.3.12 模拟赛题解
    天黑黑题意大致:给出含\(\max\)和\(+\)的表达式以及其中的\(n\)个数,求其最大值。用前缀表达式的形式给出,X表示一个要填的数,B表示\(\max\),A表示\(+\)。题解......
  • CF915E 题解(动态开点线段树)
    题目传送门简要题意:题面就挺简要的。看到题目第一眼想到线段树,再看一眼数据范围,\(1≤n≤10^9\),寄,既然不能直接用线段树,那怎么办呢?可以离散化,为了避免麻烦的离散化,......
  • P2782 友好城市题解
    题目传送门题意:给定一些上下的线段,求出最多不相交的线段数量。一开始看错题了,以为是给定一堆线段,求出线段最大不交数量,然后就写了一个树状数组优化\(dp\)结果样例都不过,......
  • CF1785D Range = √Sum 题解
    题目传送门(第一次CF场切绿欸)题意考虑将这段序列的平均数设为\(4n\),那么总和就会是\(4n^2\),这时候就需要让最值差等于\(2n\),直接让他等于\(3n\)和\(5n\)就可......
  • 【题解】CF1801G A task for substrings
    考虑拆开贡献,前缀贡献痕容易算。而跨越\([l-1,l]\)的贡献,考虑在正串ACAM找到\([1,l-1]\),反串ACAM找到\([l,r]\),那么要做的就是在两串的fail链祖先上,找到能凑成完......