当m=2时,k至少为n/2
所以序列中的每一个位置都有至少1/2的概率在k个数中
随机一个序列的位置i,计算i在k个数中时,k的最大值
计算其他n-1个数和a[i]的差b[j],另外k-1个数的b[j]的gcd>1,那么将gcd分解质因数后,任意一个分解出来的p[i]都可以代表k个数
于是将b[j]分解质因数,维护每个p[i]在多少个b[j]中出现,最大的p[i]就是k,要计算m的最大值,容易发现m就是这k个b[j]的gcd,同时如果gcd的因子包含p[i],这k个数就是因子含p[i]的所有数(k要最大),即如果gcd取了p[i]就要取p[i]整除的所有数,对每个p[i]统计出现次数时顺便统计这些数的gcd,最大的就是m

code:

#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<cmath>
#include<ctime>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<complex>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;inline void up(int &x,const int &y){if(x<y)x=y;}
int gcd(int a,int b){return !a?b:gcd(b%a,a);}
const int maxn = 110000;
const int maxp = 10000005;int p[1100000],pri,mp[maxp];
bool v[maxp];
void pre()
{for(int i=2;i<maxp;i++){if(!v[i]) p[++pri]=i,mp[i]=i;for(int j=1,k=p[j]*i;j<=pri;j++,k=p[j]*i){if(k>=maxp) break;v[k]=true; mp[k]=p[j];if(i%p[j]==0) break;}}
}int n,m;
int b[maxn];int ti[maxp],s[maxp],num[maxp],ans,nowi,re1,re2;
void upd(const int x,const int k)
{if(ti[x]!=nowi) ti[x]=nowi,num[x]=s[x]=0;num[x]++,s[x]=gcd(s[x],k);if(num[x]>num[ans]) ans=x;else if(num[x]==num[ans]&&s[x]>s[ans]) ans=x;
}
void divide(int x)
{int tmp=x;while(x>1){int pp=mp[x];while(mp[x]==pp) x/=pp;upd(pp,tmp);}
}int main()
{pre();//srand(time(0));scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&b[i]);for(nowi=1;nowi<=10;nowi++){int i=rand()%n+1,tc=0; num[ans=0]=0;for(int j=1;j<=n;j++){int k=abs(b[i]-b[j]);if(!k) tc++;divide(k);}num[ans]+=tc;if(num[ans]>re1) re1=num[ans],re2=s[ans];else if(num[ans]==re1&&s[ans]>re2) re2=s[ans];}printf("%d %d\n",re1,re2);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

    然而我太懒了--没有打哈希. 直觉告诉我第二个答案是选择的k个数的差的gcd,那么对于每一个质因数,记录一下序列中能被这个质数整除的差的gcd,然后就可以了 #include <cstdio&g ...

  4. 【PA2013】【BZOJ3837】Filary

    Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时的m.如果有多组解使得k最大,你要在此基础上求出m ...

  5. bzoj 3837 pa2013 Filary

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

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

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

  7. bzoj 3838: [Pa2013]Raper (线段树)

    3838: [Pa2013]Raper Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 53  Solved: 27 [Submit][Status] ...

  8. BZOJ3838 : [Pa2013]Raper

    将选取的$A$看成左括号,$B$看成右括号,那么答案是一个合法的括号序列. 那么只要重复取出$k$对价值最小的左右括号,保证每时每刻都是一个合法的括号序列即可. 将$($看成$1$,$)$看成$-1$ ...

  9. luogu P4694 [PA2013]Raper

    https://www.luogu.com.cn/problem/P4694 首先可以用wqswqswqs二分去掉KKK的那个限制 然后可以发现剩下的就是一个模拟费用流了 code: #include ...

最新文章

  1. Oozie 3.3.1安装
  2. JNI学习-- C调用java方法
  3. 【工具向】分析FGUI依赖关系工具
  4. dos2unix命令
  5. 设置谷歌浏览器的flash 插件
  6. 用Python在地图上模拟疫情扩散
  7. UBUNTU内核升级后,如何更新 kernel headers
  8. oracle erp系统好用么,oracleerp系统优缺点
  9. 社会人类学类毕业论文文献包含哪些?
  10. 【数据结构】循环队列的front,rear指针以及队列满的条件、计算队列长度
  11. 利用Python实现校园网自动登录(部署在树莓派)
  12. 大数据Spark(三十九):SparkStreaming实战案例四 窗口函数
  13. WARN Error while fetching metadata with correlation id 5 : {testtopic=LEADER_NOT_AVAILABLE}
  14. 郑州大学计算机系王院长,郑州大学徐明亮教授、北京航天航空大学牛建伟教授来校开展学术交流...
  15. [面试]机器学习面试常见问题
  16. tsv文件与csv文件的区别以及如何转换
  17. 感受美国小学生的幸福校园生活! (转)
  18. npm run dev卡住
  19. Teddy van Jerry 的导航页
  20. SAP ABAP 接口开发(RFC,IDOC,Webservice,Native SQL)

热门文章

  1. MY云顶之奕上分阵容
  2. JAVA WEB 入门基础第一天
  3. java中冒号的用法
  4. zipentry java_java.util.zip 类 ZipEntry - Java 中文参考手册
  5. Java SSLSocket客户端认证配置
  6. Pat(Advanced Level)Practice--1054(The Dominant Color)
  7. 论文阅读 | Bringing a Blurry Frame Alive at High Frame-Rate with an Event Camera
  8. 矩阵分析:Kronecker积,Hadamard积
  9. 两台计算机互联方案,如何让两台电脑直接用网线互联.docx
  10. IAR Systems