3837: [Pa2013]Filary

Time Limit: 60 Sec  Memory Limit: 256 MB
Submit: 395  Solved: 74
[Submit][Status][Discuss]

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 Input

6
7 4 10 8 7 1

Sample Output

5 3

HINT


听说大家都喜欢随机过题法,于是我切一道(正解是)随机的题目涨涨姿势。
首先此题在k==2 的时候最小是 $ \frac{n}{2} $ 的,以此类推 k==3 时是 $ \frac{n}{3} $等等。
那么最小的情况是大于等于$ \frac{n}{2} $的,这点毋庸置疑。
那么我们随机一个位置pos,假设a[pos]在这k个数中,找最大的k。
那么我们求a[pos]和每个位置i的差值b[i],然后我们这k个数的 $ gcd \gt 1 $ 这个毋庸置疑。那么我们把每个b[i]分解成一堆质数,并记录每个质数出现的位置数。那么最大的k就是质数出现的最大位置数。k对应的最大的m就是这些位置的数的gcd。
而据cls说这个随机期望是logn的。不过你还是多随机个四五次取最大,这样才保险点。
 #include<bits/stdc++.h>
#define clr(x) memset(x,0,sizeof(x))
#define clr_1(x) memset(x,-1,sizeof(x))
#define INF 0x3f3f3f3f
#define LL long long
#define pb push_back
#define mod 1000000007
#define ls(i) (i<<1)
#define rs(i) (i<<1|1)
#define mp make_pair
#define fi first
#define se second
using namespace std;
const int N=1e7+;
const int M=1e5+;
int inf[N],prime[N],pre[N],g[N],num[N];
int tot;
int gcd(int a,int b)
{
int c;
while(b)
c=a%b,a=b,b=c;
return a;
}
void init()
{
tot=;
int n=;
for(int i=;i<=n;i++)
{
if(!inf[i])
prime[++tot]=i,pre[i]=tot;
for(int j=;j<=tot && prime[j]*i<=n;j++)
{
inf[prime[j]*i]=;
pre[prime[j]*i]=j;
if(i%prime[j]==) break;
}
}
return ;
}
int a[M],b[M];
int main()
{
init();
int n,m,k;
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",a+i);
int p=log10(n)+;
srand(time());
m=k=;
while(p--)
{ int pos=rand()%n+;
int tmp=;
int minm=,mink=;
for(int i=;i<=n;i++)
{
b[i]=abs(a[i]-a[pos]);
if(!b[i])
tmp++;
}
for(int i=;i<=n;i++)
{
int t=b[i];
while(t && t!=)
{
int temp=pre[t];
num[temp]++,g[temp]=gcd(g[temp],b[i]);
if(mink<num[temp]) mink=num[temp],minm=g[temp];
else if(mink==num[temp]) minm=max(g[temp],minm);
while(t%prime[temp]==) t/=prime[temp];
}
}
if(mink+tmp>k) k=mink+tmp,m=minm;
else if(mink+tmp==k) m=max(m,minm);
for(int i=;i<=n;i++)
{
int t=b[i];
while(t && t!=)
{
int temp=pre[t];
num[temp]=,g[temp]=;
while(t%prime[temp]==) t/=prime[temp];
}
}
}
printf("%d %d\n",k,m);
return ;
}

bzoj 3837 (随机过题法了解一下)的更多相关文章

  1. ppt VBA 实现随机抽题

    目录 目标/最终效果 关于VBA VBA简单示例 检查环境 步骤 VBA实现随机抽题 todo challenge 目标/最终效果 目标是制作一个ppt,实现随机抽题,具体描述: 第一页幻灯片中:点击 ...

  2. HYSBZ(BZOJ) 4300 绝世好题(位运算,递推)

    HYSBZ(BZOJ) 4300 绝世好题(位运算,递推) Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<= ...

  3. BZOJ第一页刷题计划

    BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2 ...

  4. B4010 菜肴制作 拓扑排序(附随机跳题代码)

    今天写了一个自己的随机跳题小程序,第一次试发现跳的全是不可做题,但是在周围我一眼看见了这个题,不能说一眼看出来,但是也是比较有思路,所以就做他了! 做得比较顺利,做完之后美滋滋,突然发现样例第三组过不 ...

  5. 【BZOJ】初级水题列表——献给那些想要进军BZOJ的OIers(自用,怕荒废了最后的六月考试月,刷刷水题,水水更健康)

    BZOJ初级水题列表——献给那些想要进军BZOJ的OIers 代码长度解释一切! 注:以下代码描述均为C++ RunID User Problem Result Memory Time Code_Le ...

  6. bzoj 3837 pa2013 Filary

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

  7. bzoj 3224 splay模板题4

    再刷水题我就废了... #include<iostream> #include<cstdio> #include<algorithm> #include<cs ...

  8. bzoj 3223 splay模板题3

    水题...貌似理解splay怎么维护数列了... 每个点维护一个size,它的位置就是它的size,区间翻转的话可以打标记,find的时候push_down,交换左右子树. #include<i ...

  9. bzoj 4300: 绝世好题

    4300: 绝世好题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi& ...

随机推荐

  1. transform 动画效果

    http://www.css88.com/tool/css3Preview/Transform.html transform的含义是:改变,使…变形:转换 transform的属性包括:rotate( ...

  2. JDK1.8源码TreeMap

    基于红黑树(Red-Black tree)的 NavigableMap 实现:键的排序由构造方法决定:自然排序,Comparator排序:非线程安全(仅改变与现有键关联的值不是结构上的修改):线程安全 ...

  3. python(13)多线程:线程池,threading

    python 多进程:多进程 先上代码: pool = threadpool.ThreadPool(10) #建立线程池,控制线程数量为10 reqs = threadpool.makeRequest ...

  4. 六、springcloud之配置中心Config

    一.配置中心提供的核心功能 Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持.配置服务器为各应用的所有环境提供了一个中心化的外部配置.它实现了对服务端和客户端对S ...

  5. 【Android开发】之MediaPlayer的错误分析

    最近在做媒体播放器,使用了Android自带的MediaPlayer,经常性会碰到MediaPlayer报错的情况,找过网上的,感觉总结的不是很好或者比较散.下面,我来总结一下使用MediaPlaye ...

  6. JS实现幸运抽奖页面

    JS实现简单的幸运抽奖页面 效果图: 图片素材 : 代码如下,复制即可使用: <!DOCTYPE html> <html> <head lang="en&quo ...

  7. 在VirtualBox虚拟机中安装Centos操作系统怎么与本地XShell远程连接

    问题: 在VirtualBox安装好了CentOS操作系统后,我们怎么才可以用XSell连接虚拟机中的CentOS呢? 答案: (1)在windows下用cmd--ipconfig查看VirtualB ...

  8. Centos之关机和重启命令

    shutdown命令 shutdown [选项] 时间 -c:取消前一个关机命令 -h:关机 -r:重启 [root@localhost ~]# date 2017年 06月 21日 星期三 15:4 ...

  9. MySQL学习笔记:like和regexp的区别

    一.like关键字 like有两个模式:_和% _:表示单个字符,用来查询定长的数据 select name from table where name like '陈__'; %:表示0个或多个任意 ...

  10. Spring介绍及配置(XML文件配置和注解配置)

    本节内容: Spring介绍 Spring搭建 Spring概念 Spring配置讲解 使用注解配置Spring 一.Spring介绍 1. 什么是Spring Spring是一个开源框架,Sprin ...