当m取2时,k至少为$\frac{n}{2}$

所以在最优解中每个数被选中的概率至少为$\frac{1}{2}$

每次随机选取一个位置i,计算出其它数与$a_i$的差值,将差值分解质因数

所有质因数中出现次数的最大值加上与$a_i$相等的数的个数就是选取i的情况下的最优解

为了最大化m,需要将所有相同位置的因数乘起来

给每个位置随机一个权值,全部异或起来求出Hash值,排序后扫一遍统计即可

因为$a_i\leq10^7$,所以可以先一遍线性筛求出每个数是被哪个素数筛掉的,这样就可以做到$O(\log n)$分解质因数

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100010,M=10000001,P=664600;
int n,i,j,x,a[N],b[N],maxv,p[P],tot,ans1,ans2,T,cnt,pos[P],las[P],now,v[M],tmp[32],fac,vis[P];
struct PI{
int cnt,hash,num;
PI(){cnt=hash=0;num=1;}
PI(int _cnt,int _hash,int _num){cnt=_cnt,hash=_hash,num=_num;}
}pool[P];
inline bool cmp(PI a,PI b){return a.hash<b.hash;}
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void divide(int x,int y){
int i,j,k;
for(i=0;i<fac;i++)vis[tmp[i]]=0;
for(fac=0;x^1;vis[v[x]]*=p[v[x]],x/=p[v[x]])if(!vis[v[x]])tmp[fac++]=v[x],vis[v[x]]=1;
for(i=0;i<fac;i++){
k=vis[tmp[i]];
if(las[tmp[i]]^T)las[tmp[i]]=T,pool[j=pos[tmp[i]]=++now]=PI(0,0,k);else j=pos[tmp[i]];
pool[j].cnt++,pool[j].hash^=y;
if(pool[j].num>k)pool[j].num=k;
}
}
int main(){
pool[0].hash=-1;
for(read(n);i<n;i++){
read(a[i]);
while(!b[i])b[i]=rand();
if(a[i]>maxv)maxv=a[i];
}
for(i=2;i<=maxv;i++){
if(!v[i])p[v[i]=++tot]=i;
for(j=1;j<=tot;j++){
if(i*p[j]>maxv)break;
v[i*p[j]]=j;
if(i%p[j]==0)break;
}
}
for(T=1;T<=4;T++){
for(x=a[rand()%n],i=cnt=now=0;i<n;i++)if(a[i]!=x)divide(a[i]>x?(a[i]-x):(x-a[i]),b[i]);else cnt++;
sort(pool+1,pool+now+1,cmp);
for(j=0,i=1;i<=now;i++)if(pool[i].hash^pool[j].hash){
if(j){
if(pool[j].cnt+cnt>ans1)ans1=pool[j].cnt+cnt,ans2=pool[j].num;
else if(pool[j].cnt+cnt==ans1&&pool[j].num>ans2)ans2=pool[j].num;
}
j=i;
}else pool[j].num*=pool[i].num;
if(pool[j].cnt+cnt>ans1)ans1=pool[j].cnt+cnt,ans2=pool[j].num;
else if(pool[j].cnt+cnt==ans1&&pool[j].num>ans2)ans2=pool[j].num;
}
return printf("%d %d",ans1,ans2),0;
}

  

BZOJ3837 : [Pa2013]Filary的更多相关文章

  1. Bzoj3837 [Pa2013]Filary(随机化)

    题面 权限题 题解 这题有一个很好的性质,就是一定有$k>\frac n2$.接着考虑怎么做. 我们随机选取一个数$x$,然后将所有数与它作差,那么只需要找出$k$个差值使得他们的最大公因数大于 ...

  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. 【BZOJ3733】[Pa2013]Iloczyn (搜索)

    [BZOJ3733][Pa2013]Iloczyn (搜索) 题面 BZOJ 题解 把约数筛出来之后,直接爆搜,再随便剪枝就过了. 最近一句话题解倾向比较严重 #include<iostream ...

  8. 【BZOJ】3737: [Pa2013]Euler

    题意: 求满足\(phi(a)=n\)的\(a\)的个数.(\(n \le 10^{10}\)) 分析 这种题一开始就感觉是搜索= = 题解 首先容易得到 \[\phi(n) = \prod_{i} ...

  9. BZOJ 3736: [Pa2013]Karty

    Description 一个0/1矩阵,求能覆盖所有 \(1\) ,同时不覆盖所有 \(0\) 的矩阵,使这个面积最大. Sol DP/悬线法. 首先,所求的矩阵一定可以覆盖所有贴边的悬线. 用悬线法 ...

随机推荐

  1. Capistrano SSH::AuthenticationFailed, not prompting for password

    文章是从我的个人博客上粘贴过来的, 大家也可以访问 www.iwangzheng.com 在本地执行cap deploy部署的时候会报错: connection failed for: 11.11.1 ...

  2. KMP算法精髓

    这个算法的做法就是在部分匹配的时候,常规想法是向后移动一位,但是KMP想法是向后移动n位(n=m-L). 注释:这里m表示已经匹配了的字符的个数,L表示已经匹配了的那些字符组成的这个字符串的前缀和后缀 ...

  3. [BZOJ1477]青蛙的约会

    [BZOJ1477]青蛙的约会 试题描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘 ...

  4. ZeroMQ(java)中的数据流SessionBase与SocketBase

    前面的文章中已经比较的清楚了ZeroMQ(java)中如何在底层处理IO, 通过StreamEngine对象来维护SelectableChannel对象以及IO的事件回调,然后通过Poller对象来维 ...

  5. MySQL 如何只导出 指定的表 的表结构和数据 ( 转 )

    MySQL 如何只导出 指定的表 的表结构和数据 ( 转 ) 2011-01-04 15:03:33 分类: MySQL MySQL 如何只导出 指定的表 的表结构和数据 导出更个库的表结构如下:my ...

  6. 算法:comparable比较器的排序原理实现(二叉树中序排序)

    Comparable比较器排序远离实现 package test.java.api.api13; /** * 手工实现二叉树的比较算法: 第一遍感觉很神秘,但是真正自己写下来,就感觉很简单,理解就好: ...

  7. ACdream 1195 Sudoku Checker (数独)

    Sudoku Checker Time Limit:1000MS     Memory Limit:64000KB     64bit IO Format:%lld & %llu Submit ...

  8. struts1老古董配置

    <!--Struts1 struts-config.xml Demo --><?xml version="1.0" encoding="UTF-8&qu ...

  9. 如何手动修改XP系统属性中的技术支持信息

    \windows\system32目录下有个oeminof.ini,里面是OEM显示的文字信息,把相应项目修改即可,OEM图片使用的是本目录下的OEMlogo.bmp(图片:创建一个图形文件,像素尺寸 ...

  10. backslash and newline separated by space

    原来是因为\  后面多了一个空格 检查写的代码中将\后面的空格去掉就可以了.