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

题面 权限题 题解 这题有一个很好的性质,就是一定有$k>\frac n2$.接着考虑怎么做. 我们随机选取一个数$x$,然后将所有数与它作差,那么只需要找出$k$个差值使得他们的最大公因数大于$1$即可.我们可以将所有差值分解质因数,然后统计每个质因数出现的次数,再加上与$x$相等的数的个数就是$k$.统计$k$个时候顺便记录一下这些数的最大公因数即可. 根据之前说的那个性质,我们随机出真答案的期望是$log$的.但是随机化这个东西...是靠脸的,我最开始用了那个$8$位质数做种子,然后调了$…
当m取2时,k至少为$\frac{n}{2}$ 所以在最优解中每个数被选中的概率至少为$\frac{1}{2}$ 每次随机选取一个位置i,计算出其它数与$a_i$的差值,将差值分解质因数 所有质因数中出现次数的最大值加上与$a_i$相等的数的个数就是选取i的情况下的最优解 为了最大化m,需要将所有相同位置的因数乘起来 给每个位置随机一个权值,全部异或起来求出Hash值,排序后扫一遍统计即可 因为$a_i\leq10^7$,所以可以先一遍线性筛求出每个数是被哪个素数筛掉的,这样就可以做到$O(\l…
[BZOJ3837][Pa2013]Filary Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时的m.如果有多组解使得k最大,你要在此基础上求出m的最大值. Input 第一行一个正整数n(2<=n<=10^5). 第二行n个正整数w[i](1<=w[i]<=10^7).保证不会出现所有w[i]都相等的情况. Output 一行两个整数k,m.保证答案存在. Sample Inp…
[BZOJ3837][PA2013]Filary 题面 darkbzoj 题解 考虑到模数为\(2\)时答案至少为\(\frac n2\),这是我们答案的下界. 那么我们对于任意的一个数,它们答案集合中的就概率至少为\(\frac 12\). 那么我们随机选出一个数,将这个数与其他数作差,那么将这些数分解质因数后出现次数最多的数的个数就是出现次数,而含有这个质因数的所有数的\(gcd\)就是这种情况. 因为值域\(\leq 10^7\),所以你把每个数最小的质因子筛出来就可以做到\(\log\)…
bzoj 先搞第一问.考虑简单情况,如果\(m=2\),那么一定有个剩余类大小\(\ge \lceil\frac{n}{2}\rceil\),同时这也是答案下界 然后我们每次随机选出一个数\(a_i\),然后钦定它在我们要的剩余类里,现在再枚举其他数,看一下最多有多少个数\(a_j\)可以和他模\(m\)同余,也就是选最多的数满足\(\gcd(|a_i-a_{j_1}|,|a_i-a_{j_2}|,|a_i-a_{j_3}|...)>1\).那对于每个\(j\),把所有\(|a_i-a_j|\)…
3837: [Pa2013]Filary Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 395  Solved: 74[Submit][Status][Discuss] Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等.   求出k的最大值,并求出此时的m.如果有多组解使得k最大,你要在此基础上求出m的最大值.   Input 第一行一个正整数n(2<=n<=10^5).…
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem 10983 18765 Y 1036 [ZJOI2008]树的统计Count 5293 13132 Y 1588 [HNOI2002]营业额统计 5056 13607 1001 [BeiJing2006]狼抓兔子 4526 18386 Y 2002 [Hnoi2010]Bounce 弹飞绵羊 43…
APP漏洞扫描用地址空间随机化 前言 我们在前文<APP漏洞扫描器之本地拒绝服务检测详解>了解到阿里聚安全漏洞扫描器有一项静态分析加动态模糊测试的方法来检测的功能,并详细的介绍了它在针对本地拒绝服务的检测方法. 同时,阿里聚漏洞扫描器有一个检测项叫未使用地址空间随机化技术, 该检测项会分析APP中包含的ELF文件判断它们是否使用了该项技术.如果APP中存在该项漏洞则会降低缓冲区溢出攻击的门槛. 本文主要介绍该项技术的原理和扫描器的检测方法.由于PIE的实现细节较复杂,本文只是介绍了大致的原理.…
#include <cstdio> #include <cstdlib> #include <ctime> typedef long long int LL; inline bool qpow(int a,int x) { ,ans = ; while(b) { ) ans = (LL)ans*a%x; a = (LL)a*a%x; b >>= ; } ) return true; else return false; } inline bool rabin…
题目:http://poj.org/problem?id=2454 题意:给你3*k(k<=60)个数,你要将它们分成3个长度为k的序列,使得其中至少有两个序列的和大于k*500 分析:以为有高大上的做法,然后题解爸爸告诉我是随机化乱搞…… 首先可以把最小的k个去掉 然后将剩下的2*k个分成2组 接下来随机化交换它们中的两个数,并判断…… 只能说略猥琐…