【BZOJ3837】[Pa2013]Filary 随机化神题
【BZOJ3837】[Pa2013]Filary
Description
Input
Output
Sample Input
7 4 10 8 7 1
Sample Output
题解:我们随机选取一个数x,然后将所有数与它作差,那么只需要找出k个差值使得他们的gcd>1即可。我们可以将所有差值分解质因数,然后统计每个质因数出现的次数,再加上与x相等的数的个数就是k。统计k个时候顺便记录一下这些数的gcd即可。
本题还有一个特殊性质,当m=2时,k一定>n/2。所以我们期望随机log次就能得到一个选中的数了。(实际情况根据随机的种子而定,一开始自己设的种子要么奇慢无比,要么WA,后来把种子去掉,随机4次就行了。)
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
const int maxn=100010;
int n,x,nk,nm,k,m,num;
int pri[1000010],lp[10000010],s[1000010],g[1000010];
bool np[10000010];
int v[maxn],c[maxn];
int rd()
{
int ret=0; char gc=getchar();
while(gc<'0'||gc>'9') gc=getchar();
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret;
}
int gcd(int a,int b)
{
return (!b)?a:gcd(b,a%b);
}
int main()
{
int i,j,T;
for(i=2;i<=10000000;i++)
{
if(!np[i]) pri[++num]=i,lp[i]=num;
for(j=1;j<=num&&i*pri[j]<=10000000;j++)
{
np[i*pri[j]]=1,lp[i*pri[j]]=j;
if(i%pri[j]==0) break;
}
}
n=rd();
for(i=1;i<=n;i++) v[i]=rd();
for(T=1;T<=4;T++)
{
x=v[rand()%n+1];
for(s[0]=0,i=1;i<=n;i++)
{
c[i]=abs(v[i]-x);
if(!c[i]) s[0]++;
}
nk=0;
for(i=1;i<=n;i++)
{
int t=c[i];
while(t&&t!=1)
{
int tmp=lp[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%pri[tmp]==0) t/=pri[tmp];
}
}
if(nk>k) k=nk,m=0;
if(nk==k) m=max(m,nm);
for(i=1;i<=n;i++)
{
int t=c[i];
while(t&&t!=1)
{
int tmp=lp[t];
s[tmp]=g[tmp]=0;
while(t%pri[tmp]==0) t/=pri[tmp];
}
}
}
printf("%d %d",k,m);
return 0;
}
【BZOJ3837】[Pa2013]Filary 随机化神题的更多相关文章
- Bzoj3837 [Pa2013]Filary(随机化)
题面 权限题 题解 这题有一个很好的性质,就是一定有$k>\frac n2$.接着考虑怎么做. 我们随机选取一个数$x$,然后将所有数与它作差,那么只需要找出$k$个差值使得他们的最大公因数大于 ...
- BZOJ3837 : [Pa2013]Filary
当m取2时,k至少为$\frac{n}{2}$ 所以在最优解中每个数被选中的概率至少为$\frac{1}{2}$ 每次随机选取一个位置i,计算出其它数与$a_i$的差值,将差值分解质因数 所有质因数中 ...
- 【BZOJ3837】[PA2013]Filary
[BZOJ3837][PA2013]Filary 题面 darkbzoj 题解 考虑到模数为\(2\)时答案至少为\(\frac n2\),这是我们答案的下界. 那么我们对于任意的一个数,它们答案集合 ...
- bzoj 3837 (随机过题法了解一下)
3837: [Pa2013]Filary Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 395 Solved: 74[Submit][Status] ...
- B4010 菜肴制作 拓扑排序(附随机跳题代码)
今天写了一个自己的随机跳题小程序,第一次试发现跳的全是不可做题,但是在周围我一眼看见了这个题,不能说一眼看出来,但是也是比较有思路,所以就做他了! 做得比较顺利,做完之后美滋滋,突然发现样例第三组过不 ...
- ppt VBA 实现随机抽题
目录 目标/最终效果 关于VBA VBA简单示例 检查环境 步骤 VBA实现随机抽题 todo challenge 目标/最终效果 目标是制作一个ppt,实现随机抽题,具体描述: 第一页幻灯片中:点击 ...
- bzoj 3837 pa2013 Filary
bzoj 先搞第一问.考虑简单情况,如果\(m=2\),那么一定有个剩余类大小\(\ge \lceil\frac{n}{2}\rceil\),同时这也是答案下界 然后我们每次随机选出一个数\(a_i\ ...
- 软件工程课程作业(一)—20道随机四则运算题(C++)
一.编程思想: 1.定义所需要变量2.设置数组,存储运算符,3.通过随机函数random(0,100)找出运算数,random(0,4)找出运算符4.通过输出显示运算式. 二.源代码: //2016 ...
- [BZOJ5361][Lydsy1805月赛]对称数
bzoj Description 给你一棵树,每个点有一个编号\(a_i\).\(Q\)组询问,每次问一条路径上最小的出现了偶数次的编号是多少(包括零次). 多组数据,\(T\le10,n,Q,a_i ...
随机推荐
- JavaWeb学习总结(十三)——使用Session防止表单重复提交(转)
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...
- 转 浅谈C++中指针和引用的区别
浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性 ...
- hdu 4632 子字符串统计的区间dp
题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. 简单的区间dp,哎,以为很神奇的东西,其实也是dp,只是参数改为区间,没做过此类型的题,想不到用dp,以后就 知道了,若已经知道[ ...
- HDU 5726 GCD(ST&RMQ)
题目链接 GCD 先ST倍增预处理,f[i][j]表示从i开始(包含第i个数)的连续2^j个数的最大公约数. 这样就可以在O(1)内询问得到a[l]到a[r]之间的所有数的最大公约数的值. 然后对于每 ...
- Careercup | Chapter 2
链表的题里面,快慢指针.双指针用得很多. 2.1 Write code to remove duplicates from an unsorted linked list.FOLLOW UPHow w ...
- git常用语句
1.安装git,也适用于升级 yum -y install gcc zlib-devel openssl-devel curl-devel \ expat-devel gettext-devel pe ...
- [bug]Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding
写在前面 在mysql中这个异常是非常常见的,超时分为连接超时和执行超时,而连接超时,大部分原因是网络问题,或客户端到服务端的端口问题造成. bug场景 有的时候,使用MySqlDataReader在 ...
- JavaScript校验输入的字符串是否包含特殊字符
校验在文本框输入的字符串中是否包含特殊字符串,js代码如下 function strInclude(substring){ if(substring){ var reg = new RegExp(&q ...
- apk 签名
给apk签名步骤:(比方apk名称是EasyMsg.apk) (1)将EasyMsg.apk包后缀改为zip, EasyMsg.zip (2)删除EasyMsg.zip文件包中的META-INF目录, ...
- Win7/Win2008下IIS配置Asp网站启用父路径的设置方法(已解决)
Win7/Win2008下IIS配置Asp网站启用父路径的设置方法(已解决) 在Win7/Win2008下IIS配置Asp网站启用父路径的设置方法与win2003下不同,看看下图就知道了.