题意:给你一个序列,定义ghd为一个序列中任意n / 2个数的gcd中最大的那个,现在问这个序列的ghd为多少。

思路:居然是论文题。。。来自2014年国家集训队论文《随机化算法在信息学竞赛中的应用》,作者胡泽聪。

这里大概记录一下思想:先不考虑复杂度,考虑枚举。对于每个枚举的数,我们假设它在构成ghd的集合中,那么怎么求ghd呢?首先,如果选择的数(x)在ghd集合中,那么ghd一定是x的因子。我们可以先让x和其它的数求gcd,然后如果gcd的某个因子也是x的因子,那么对应因子的数目++。实际实现不需要对每个gcd因式分解,如果gcd本身就是x的因子,在对应项+1.之后,我们从小到大枚举因子,把比它大的并且能被自己整除因子的贡献加到自己身上就可以了。假设因子个数是g(x), 那么单次枚举的复杂度是O(nlogn + g(x) ^ 2 + x ^ (1 / 2))。我们考虑随机,因为每次选x都有一半的概率选到最大的ghd的集合中,所以我们选12个点,取最大值就可以了,错误概率为1 - ((1 / 2) ^ 12)),已经很小了。

代码:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 1000010;
LL ans = 0;
mt19937 random(time(0));
vector<LL> fac;
LL a[maxn], g[maxn];
int n;
void div(LL n) {
fac.clear();
for (LL i = 1; i * i <= n; i++) {
if(n % i == 0) {
fac.push_back(i);
if(i * i != n) fac.push_back(n / i);
}
}
sort(fac.begin(), fac.end());
}
void solve(int p) {
for (int i = 1; i <= n; i++)
g[i] = __gcd(a[i], a[p]);
div(a[p]);
vector<LL> sum(fac.size());
for (int i = 1; i <= n; i++) {
int pos = lower_bound(fac.begin(), fac.end(), g[i]) - fac.begin();
if(pos >= 0 && pos < fac.size()) sum[pos]++;
}
for (int i = 0; i < fac.size(); i++) {
for (int j = i + 1; j < fac.size(); j++) {
if(fac[j] % fac[i] == 0) sum[i] += sum[j];
}
}
for (int i = fac.size() - 1; i >= 0; i--) {
if(sum[i] * 2 >= n) {
ans = max(ans, fac[i]);
return;
}
}
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
}
for (int i = 1; i <= 12; i++) {
int pos = random() % n + 1;
solve(pos);
}
printf("%lld\n", ans);
}

  

Codeforces 364D 随机算法的更多相关文章

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

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

  2. 微信红包中使用的技术:AA收款+随机算法

    除夕夜你领到红包了吗?有的说“我领了好几K!”“我领了几W!” 土豪何其多,苦逼也不少!有的说“我出来工作了,没压岁钱了,还要发红包”.那您有去抢微信红包吗?微信群中抢“新年红包”春节爆红.618微信 ...

  3. POJ 3318 Matrix Multiplication(随机算法)

    题目链接 随机算法使劲水...srand((unsigned)time(0))比srand(NULL)靠谱很多,可能是更加随机. #include <cstdio> #include &l ...

  4. 抽奖随机算法的技术探讨与C#实现

    一.模拟客户需求 1.1 客户A需求:要求每次都按照下图的概率随机,数量不限,每个用户只能抽一次,抽奖结果的分布与抽奖概率近似. 1.2 客户B需求:固定奖项10个,抽奖次数不限,每个用户只能抽一次, ...

  5. hdu 4712 (随机算法)

    第一次听说随机算法,在给的n组数据间随机取两个组比较,当随机次数达到一定量时,答案就出来了. #include<stdio.h> #include<stdlib.h> #inc ...

  6. 权重随机算法的java实现

    一.概述 平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的.如广告投放.负载均衡等. 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果 ...

  7. hdu 4712 Hamming Distance ( 随机算法混过了 )

    Hamming Distance Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  8. HDU4712+随机算法

    随机算法 求n个20位的2进制串的MinDist. Dist:两个串的异或结果中1的个数 /* 随机算法 */ #include<algorithm> #include<iostre ...

  9. LOJ #2540. 「PKUWC 2018」随机算法(概率dp)

    题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 ...

随机推荐

  1. vue代理配置之二--dev方式启动的index.js配置

    'use strict' // Template version: 1.3.1 // see http://vuejs-templates.github.io/webpack for document ...

  2. 特朗普或出席!富士康耗资100亿美元建LCD液晶面板厂

    富士康建液晶工厂,富士康科技集团发言人证实,富士康科技集团将于今年6月28日耗资100亿美元的LCD面板厂举行动工仪式. 富士康周四表示,他已经了解到,仪式将于今年6月28日举行,包括美国总统特朗普总 ...

  3. CONNECT_BY_ROOT

    1.select * from  EMP t  where t.deptno = 10;   EMPNO     ENAME     JOB     MGR     HIREDATE     SAL  ...

  4. VMware安装MAC OS

    测试环境 安装环境:win10 .VMware Workstation Pro14 镜像:OS X 10.11.5(由于太大,就没有上传网盘,网上也有很多资源) 安装准备 安装前先把关于VMware的 ...

  5. [CSP-S模拟测试]:回文串(hash+二分)

    题目描述 $ASDFZ$的机房中不仅有红太阳,还有蓝太阳和原谅色太阳.有一天,太阳们来到机房,发现桌上有不知道哪个蒟蒻放上的问题:令$F(A,B)$表示选择一个串$A$的非空前缀$S$和串$B$的非空 ...

  6. iOS 获取全局唯一标示符

    这个方法用来产生一个唯一的标示符,每次调用都会不一样,所以可以用当作一些临时缓存文件的名字 NSString *identifier = [[NSProcessInfo processInfo] gl ...

  7. python练习题自己实现一个字符串的find函数

    # 第五题:自己实现一个字符串的find函数 # 1.在一个字符串中查找另一个字符串 # 2.找到了返回第一次出现的位置 # 3.没找到返回-1 # 4.参数s1为源字符串,参数s2为要查找的字符串 ...

  8. sudo su 和sudo -s的区别

    sudo su 和 sudo -s都是切换到root用户,不同的是: sudo su 环境用的是目标用户(root)的环境 sudo -s 环境用的是当前用户本身的环境

  9. AGC037C Numbers on a Circle

    题目大意 给你一个序列a和序列b 每次操作是a[i]+=a[i-1]+a[i+1] 问a经过最少几次操作可以得到b 分析 用堆维护a 每次取出最大的 撤销操作直到不能撤销 将新数放入堆 不断维护即可 ...

  10. VMware中对Linux虚拟机的网络配置静态IP的配置

    前言 踏出象牙塔,进入公司,由于公司的所有产品都是Linux下的,必然自己这段时间需要在自己的工作机器先学习一下.项目代码是用Source Insight进行查看的,总是Ctrl + Alt的切来切去 ...