[CF364D]Ghd

题目大意:

有\(n(n\le10^6)\)个数\(A_{1\sim n}(A_i\le10^{12})\),从中选取\(\lceil\frac n2\rceil\)个数,使得这些数的\(\gcd\)最大,求最大\(\gcd\)。

思路:

每个数有超过\(\frac12\)的概率被选取,因此可以随机一个数\(A_k\),强制要求它在被选取的集合内。对于所有\(A_i\),求\(\gcd(A_i,A_k)\),令\(B_i=\gcd(A_i,A_k)\)。从大到到小枚举每一个\(B_i\),统计有多少\(B_j\)是其倍数,若超过\(\lceil\frac n2\rceil\)则说明是一种可能的解,更新\(ans\)。

多随机几次正确率大大提高,然后剪剪枝就过了。

源代码:

#include<map>
#include<ctime>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<algorithm>
typedef long long int64;
inline int64 getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int64 x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=1e6+1;
int64 a[N];
std::map<int64,int> map;
int main() {
srand(time(NULL));
const int n=getint();
for(register int i=1;i<=n;i++) {
a[i]=getint();
}
int64 ans=0;
for(register int T=0;T<10;T++) {
const int k=1ll*rand()*rand()%n+1;
if(a[k]<=ans) continue;
map.clear();
for(register int i=1;i<=n;i++) {
if(a[i]<=ans) continue;
const int64 x=std::__gcd(a[i],a[k]);
if(x>ans) map[x]++;
}
std::vector<std::pair<int64,int>> v(map.begin(),map.end());
std::reverse(v.begin(),v.end());
for(register unsigned i=0;i<v.size();i++) {
if(v[i].first<ans) break;
int cnt=0;
for(register unsigned j=0;j<=i;j++) {
if(v[j].first%v[i].first==0) {
cnt+=v[j].second;
}
if(cnt>=(n+1)/2) break;
}
if(cnt>=(n+1)/2) ans=v[i].first;
}
}
printf("%I64d\n",ans);
return 0;
}

[CF364D]Ghd的更多相关文章

  1. 【数学 随机 技巧】cf364D. Ghd

    随机化选讲的例题 John Doe offered his sister Jane Doe find the gcd of some set of numbers a. Gcd is a positi ...

  2. CF364D Ghd(随机化)

    另一个集合\(s\)的\(ghd\)为\(max\{gcd(s')||s'|>=0.5|s|\}\) 给定序列\(a\),求\(ghd\) 随机化算法.因为\(|s'|\geq 0.5|S|\) ...

  3. ZJOI2019一轮游记

    Preface 期待已久的省选终于开始了233,关于之前的一些内容,在ZJOI2019一轮停课刷题记录都可以找到,这里不再赘述 ZJOI2019,Bless All Day -1 今天难得有休息,昨晚 ...

  4. 【题解】[Ghd]

    [题解]Ghd 一道概率非酋题? 题目很有意思,要我们选出大于\(\frac{n}{2}\)个数字使得他们的最大公约数最大. 那么我们若随便选择一个数字,他在答案的集合里的概率就大于\(0.5\)了. ...

  5. [Codeforces 364D]Ghd(随机算法+gcd)

    [Codeforces 364D]Ghd(随机算法) 题面 给出n个正整数,在其中选出n/2(向上取整)个数,要求这些数的最大公约数最大,求最大公约数的最大值 分析 每个数被选到的概率\(\geq \ ...

  6. ZJOI2019Round#1

    考的这么差二试基本不用去了 不想说什么了.就把这几天听课乱记的东西丢上来吧 这里是二试乱听课笔记ZJOI2019Round#2 ZJOI Round#1 Day1 M.<具体数学>选讲 罗 ...

  7. HTML5移动开发学习笔记之CSS3基础学习

    CSS回顾 在学CSS3之前首先巩固下CSS的基础知识. 1.CSS框模型 举例子: #box { width: 70px; margin: 10px; padding: 5px; } 这个代码将出现 ...

  8. windows7 64位下环境搭建scrapy爬虫框架

    适用于python 2.7 64位安装 一.操作系统:WIN7 64位 二.python版本:2.7 64位(scrapy目前不支持3.x) 不确定位数的,看图

  9. PHP面试题目搜集

    搜集这些题目是想在学习PHP方面知识有更感性的认识,单纯看书的话会很容易看后就忘记. 曾经看过数据结构.设计模式.HTTP等方面的书籍,但是基本看完后就是看完了,没有然后了,随着时间的推移,也就渐渐忘 ...

随机推荐

  1. 树莓派3B+ 安装系统

    安装概要步骤: 官网下载系统->刷入TF卡->设置开启显示器和SSH->通电->进入系统 1. 进入官方网站下载系统镜像 下载页面:https://www.raspberryp ...

  2. mysql设置某列不重复

    5.1版本以上:ALTER TABLE dbname.table ADD UNIQUE (fieldname); 数据库名为dbname,表名table,字段名fieldname.

  3. 题解 P3871 【[TJOI2010]中位数】

    orz各位大佬,题解太强了,主席树,堆,线段树,splay,还有暴力,太巨了.所以我用的是fhq treap(好像更高级).算了. 反正都是平衡树,这道题就是动态求中位数,不会做的同学可以先做弱化版P ...

  4. CentOS7离线安装mysql5.7

    下载mysql5.7,系统选择redhat,版本选择RHEL7,下载RPM Bundle后得到一个tar文件.这里得到文件mysql-5.7.25-1.el7.x86_64.rpm-bundle.ta ...

  5. HG奋斗赛A[20190428]

    T1 很简单,判断这个字符串有多少个不同的字符,让后用k减一减 注意: 1.如果不同字符数大于k,不要输出负数 2.变量名别打错 上代码 #include <cstdio> #includ ...

  6. 好奇,项目根目录下的.editorconfig文件

    一..editorconfig文件是什么? 在项目里,大多时候都能看到.editorconfig文件,刚开始总是忽视掉它,认为它不太重要.但是,它的存在,必定有它的理由,于是,抽空来研究一下,它是什么 ...

  7. Java基础12-工具类;变长参数;IO

    作业解析 取出整数的16进制表示形式 \u00ff /** * int2hex * */ public static String int2hex(int i) { String str = &quo ...

  8. WebApi-1 与MVC路由机制比较

    在MVC里面,默认路由机制是通过url路径去匹配对应的action方法 public class RouteConfig { public static void RegisterRoutes(Rou ...

  9. [转]Jupyter默认目录和默认浏览器修改

    转摘于:https://blog.csdn.net/caterfreelyf/article/details/79774311 1.打开cmd,首先进入到Jupyter的安装目录,我的是在D:\Pyt ...

  10. 数据库入门-pymysql模块的使用

    一.pymysql模块安装 由于本人的Python版本为python3.7,所以用pymysql来连接数据库(mysqldb不支持python3.x) 方法一: #在cmd输入 pip3 instal ...