题面

权限题

题解

这题有一个很好的性质,就是一定有$k>\frac n2$。接着考虑怎么做。

我们随机选取一个数$x$,然后将所有数与它作差,那么只需要找出$k$个差值使得他们的最大公因数大于$1$即可。我们可以将所有差值分解质因数,然后统计每个质因数出现的次数,再加上与$x$相等的数的个数就是$k$。统计$k$个时候顺便记录一下这些数的最大公因数即可。

根据之前说的那个性质,我们随机出真答案的期望是$log$的。但是随机化这个东西...是靠脸的,我最开始用了那个$8$位质数做种子,然后调了$10$次,最后调了半天改成不用种子,随机$4$次。

#include <cstdio>
#include <cstring>
#include <algorithm>
using std::min; using std::max;
using std::swap; using std::sort;
using std::__gcd;
typedef long long ll; template<typename T>
void read(T &x) {
int flag = 1; x = 0; char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') flag = -flag; ch = getchar(); }
while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); x *= flag;
} const int N = 1e5 + 10, M = 1e7 + 10, _ = 1e6 + 10;
int n, x, nk, nm, k, m, tot;
int prime[_], save[M], s[_], g[_], v[N], c[N];
bool notprime[M]; int main () {
for(int i = 2; i <= 10000000; ++i) {
if(!notprime[i]) prime[++tot] = i, save[i] = tot;
for(int j = 1; j <= tot && i * prime[j] <= 10000000; ++j) {
notprime[i * prime[j]] = 1, save[i * prime[j]] = j;
if(!(i % prime[j])) break;
}
} read(n);
for(int i = 1; i <= n; ++i) read(v[i]);
for(int T = 1; T <= 4; ++T) {
x = v[rand() % n + 1], nk = s[0] = 0;
for(int i = 1; i <= n; ++i) {
c[i] = abs(v[i] - x);
if(!c[i]) ++s[0];
}
for(int i = 1; i <= n; ++i) {
int t = c[i];
while(t && t != 1) {
int tmp = save[t];
++s[tmp], g[tmp] = __gcd(g[tmp], c[i]);
if(nk < s[tmp] + s[0]) nk = s[tmp] + s[0], nm = 0;
if(nk == s[tmp] + s[0]) nm = max(nm, g[tmp]);
while(!(t % prime[tmp])) t /= prime[tmp];
}
} if(nk > k) k = nk, m = 0;
if(nk == k) m = max(m, nm);
for(int i = 1; i <= n; ++i) {
int t = c[i];
while(t && t != 1) {
int tmp = save[t];
s[tmp] = g[tmp] = 0;
while(!(t % prime[tmp])) t /= prime[tmp];
}
}
}printf("%d %d\n", k, m);
return 0;
}

Bzoj3837 [Pa2013]Filary(随机化)的更多相关文章

  1. BZOJ3837 : [Pa2013]Filary

    当m取2时,k至少为$\frac{n}{2}$ 所以在最优解中每个数被选中的概率至少为$\frac{1}{2}$ 每次随机选取一个位置i,计算出其它数与$a_i$的差值,将差值分解质因数 所有质因数中 ...

  2. 【BZOJ3837】[Pa2013]Filary 随机化神题

    [BZOJ3837][Pa2013]Filary Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时 ...

  3. 【BZOJ3837】[PA2013]Filary

    [BZOJ3837][PA2013]Filary 题面 darkbzoj 题解 考虑到模数为\(2\)时答案至少为\(\frac n2\),这是我们答案的下界. 那么我们对于任意的一个数,它们答案集合 ...

  4. bzoj 3837 pa2013 Filary

    bzoj 先搞第一问.考虑简单情况,如果\(m=2\),那么一定有个剩余类大小\(\ge \lceil\frac{n}{2}\rceil\),同时这也是答案下界 然后我们每次随机选出一个数\(a_i\ ...

  5. bzoj 3837 (随机过题法了解一下)

    3837: [Pa2013]Filary Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 395  Solved: 74[Submit][Status] ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. APP漏洞扫描用地址空间随机化

    APP漏洞扫描用地址空间随机化 前言 我们在前文<APP漏洞扫描器之本地拒绝服务检测详解>了解到阿里聚安全漏洞扫描器有一项静态分析加动态模糊测试的方法来检测的功能,并详细的介绍了它在针对本 ...

  8. rabin 素性检验 随机化算法

    #include <cstdio> #include <cstdlib> #include <ctime> typedef long long int LL; in ...

  9. [USACO2005][POJ2454]Jersey Politics(随机化)

    题目:http://poj.org/problem?id=2454 题意:给你3*k(k<=60)个数,你要将它们分成3个长度为k的序列,使得其中至少有两个序列的和大于k*500 分析:以为有高 ...

随机推荐

  1. 51Nod 1182 完美字符串

    Input示例 dad Output示例 77 #include "bits/stdc++.h" using namespace std; #define LL long long ...

  2. 【bzoj1572-工作安排】贪心

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1572 题意: 约翰接到了N份工作,每份工作恰好占用一天的时间.约翰从第一天开始工作,他可以任意 ...

  3. 【Foreign】Uria [欧拉函数]

    Uria Time Limit: 20 Sec  Memory Limit: 512 MB Description 从前有个正整数 n. 对于一个正整数对 (a,b),如果满足 a + b ≤ n 且 ...

  4. HDU 1599 find the mincost route (最短路 floyd)

    题目链接 Problem Description 杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V1,V2,....V ...

  5. 使用SQL Server连接xml接口,读取并解析数据

    --数据源格式,放到任意程序中部署接口即可--<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmln ...

  6. 【遍历集合】Java遍历List,Map,Vector,Set的几种方法

    关于list,map,set的区别参考http://www.cnblogs.com/qlqwjy/p/7406573.html 1.遍历list @Test public void testList( ...

  7. ShellCode的几种调用方法

    ShellCode是一种漏洞代码,中文名也叫填充数据,一般是用C语言或者汇编编写.在研究的过程中,自己也学到了一些东西,发现其中也有许多坑,所以贴出来,如果大家有碰到的,可以参考一下. 以启动电脑上的 ...

  8. Python标准库笔记(4) — collections模块

    这个模块提供几个非常有用的Python容器类型 1.容器 名称 功能描述 OrderedDict 保持了key插入顺序的dict namedtuple 生成可以使用名字来访问元素内容的tuple子类 ...

  9. python基础===将json转换为dict的办法

    首先json是字符串. 大家都知道,字符串是用来传递信息的.json字符串实际上就是一种规定了格式的字符串, 通过这种格式,我们可以在不同的编程语言之间互相传递信息,比如我们可以把javascript ...

  10. $scope作用及模块化解决全局问题

    $scope对象就是一个普通的JavaScript对象,我们可以在其上随意修改或添加属性.$scope对象在AngularJS中充当数据模型,但与传统的数据模型不一样,$scope并不负责处理和操作数 ...