Description

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

第一行一个正整数n(2<=n<=10^5)。
第二行n个正整数wi。保证不会出现所有w[i]都相等的情况。
Output

一行两个整数k,m。保证答案存在。
Sample Input

6

7 4 10 8 7 1
Sample Output

5 3
HINT

Source

这题好厉害呀QAQ
首先可以发现答案k最小也得是n2\frac n 2,感觉可以用奇怪的姿势乱搞?但是我的姿势水平并不足够想出正确的乱搞算法
然后就翻了zky的提交记录和Claris的题解QAQ
因为答案最小是n2\frac n 2,所以这就意味着一个数至少也有12\frac 1 2的概率在被选中的k个数里,所以可以设计一个随机+Hash的做法.
每次随机找一个数aia_i,将这个数作为必选的k个数之一,然后用其他数对其作差,对差值分解质因数.

我们考虑找出分解出的质因数里出现次数最多的那个数,每个数我们都可以看成是拆分为ai+deltaa_i+delta,考虑对取模后的结果得贡献aia_i部分都是一样的,然后deltadelta有相同质因数的,对那个质因数取模后贡献是一样的(0),所以出现次数最多的那个质因数的出现次数再加上aia_i出现的次数就是最优情况下的k.

对于那个固定的k找一个m,只需要把那些找到的所有对应位置的因数乘一下,然后看一看总共出现过哪些结果,找到最小的那个.

对于数目的统计,可以对每个数给一个随机hash值,异或起来求出hash值,然后排序扫一遍.

如果你觉得我写的口胡根本看不懂的话..Claris题解传送门
你也可以直接从QQ上找Claris问.(我怕我口胡错掉QAQ)

最后,今天是3.30,蓝月亮lct1999的生日,代码里粗线了奇怪的东西!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 100010
#define MAXV 10000010
#define SIZE 700000
#define GET (ch>='0'&&ch<='9')
using namespace std;
int n,k,m,cnt,tp,T;
int a[MAXN],b[MAXN],maxn;
bool not_prime[MAXV];
int prime[SIZE],top,id[MAXV],fac[MAXV];
int vis[SIZE],sta[40],pow;
int pos[SIZE],lst[SIZE];
struct happy_birthday_lct1999
{int cnt,hash,num;happy_birthday_lct1999(){   hash=cnt=0;num=1;   }happy_birthday_lct1999(int Cnt,int Hash,int Num)    {   cnt=Cnt;hash=Hash;num=Num;  }inline bool operator <(const happy_birthday_lct1999 &a)const    {   return hash<a.hash; }
}s[SIZE];
inline void in(int &x)
{char ch=getchar();x=0;while (!GET)    ch=getchar();while (GET) x=x*10+ch-'0',ch=getchar();
}
void check()
{for (int i=2;i<=maxn;++i){if (!not_prime[i])  prime[++top]=i,fac[i]=i,id[i]=top;for (int j=1;j<=top&&i*prime[j]<=maxn;++j){fac[i*prime[j]]=prime[j];id[i*prime[j]]=j;not_prime[i*prime[j]]=1;if (i%prime[j]==0)  break;}}
}
void solve(int x,int y)
{int tmp=0,t=0;for (int i=1;i<=pow;++i)    vis[sta[i]]=0;pow=0;for (;x!=1;vis[id[x]]*=fac[x],x/=fac[x])    if (!vis[id[x]])    vis[sta[++pow]=id[x]]=1;for (int i=1;i<=pow;++i){tmp=vis[sta[i]];if (lst[sta[i]]!=T) lst[sta[i]]=T,s[t=pos[sta[i]]=++tp]=happy_birthday_lct1999(0,0,tmp);else    t=pos[sta[i]];++s[t].cnt;s[t].hash^=y;s[t].num=min(s[t].num,tmp);}
}
int main()
{in(n);s[0].hash=-1;for (int i=1;i<=n;i++){in(a[i]);maxn=max(maxn,a[i]);while (!b[i])   b[i]=rand();}check();for (T=1;T<=4;++T){int x=a[rand()%n+1],i,j=0;cnt=tp=0;for (i=1;i<=n;i++)if (a[i]!=x)    solve(max(a[i]-x,x-a[i]),b[i]);else    cnt++;sort(s+1,s+tp+1);for (int i=1;i<=tp;++i)if (s[i].hash!=s[j].hash){if (j){if (s[j].cnt+cnt>k) k=s[j].cnt+cnt,m=s[j].num;else    if (s[j].cnt+cnt==k&&s[j].num>m)    m=s[j].num;}j=i;}else    s[j].num*=s[i].num;if (s[j].cnt+cnt>k) k=s[j].cnt+cnt,m=s[j].num;else    if (s[j].cnt+cnt==k&&s[j].num>m)    m=s[j].num;}printf("%d %d\n",k,m);
}

【PA2013】【BZOJ3837】Filary相关推荐

  1. 【BZOJ3837】[Pa2013]Filary 随机化神题

    [BZOJ3837][Pa2013]Filary Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时 ...

  2. 【快速上手mac必备】常用优质mac软件推荐(音视频、办公、软件开发、辅助工具、系统管理、云存储)

    本文章的主要内容是我作为一名大四学生.准程序员.up主这三种身份来给大家推荐一下 mac 上好用的软件以及工具.本人也是从去年9月份开始从windows阵营转移到了mac阵营,刚开始使用的时候,也曾主 ...

  3. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  4. 【C++自我精讲】基础系列二 const

    [C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...

  5. (四)Asp.net web api中的坑-【api的返回值】

    (四)Asp.net web api中的坑-[api的返回值] 原文:(四)Asp.net web api中的坑-[api的返回值] void无返回值 IHttpActionResult HttpRe ...

  6. 【C++】【九】栈的应用

    [C++][九]栈的应用 就近匹配原理及其步骤: 中缀转后缀:

  7. 【跃迁之路】【495天】程序员高效学习方法论探索系列(实验阶段252-2018.06.15)...

    @(跃迁之路)专栏 实验说明 从2017.10.6起,开启这个系列,目标只有一个:探索新的学习方法,实现跃迁式成长 实验期2年(2017.10.06 - 2019.10.06) 我将以自己为实验对象. ...

  8. (10)Spring Boot修改端口号【从零开始学Spring Boot】

    Spring boot 默认端口是8080,如果想要进行更改的话,只需要修改applicatoin.properties文件,在配置文件中加入: server.port=9090 常用配置: #### ...

  9. 【跃迁之路】【725天】程序员高效学习方法论探索系列(实验阶段482-2019.2.15)...

    实验说明 从2017.10.6起,开启这个系列,目标只有一个:探索新的学习方法,实现跃迁式成长 实验期2年(2017.10.06 - 2019.10.06) 我将以自己为实验对象. 我将开源我的学习方 ...

  10. 【2018.12.15】【考试总结】【模拟+逆序对+树状数组+贪心+multiset】爆零之旅

    这是我悲惨的接近爆零的一次考试,但是本蒟蒻不能放弃,还是要总结的QAQ 答题卡 [题目背景] 八月是个悲惨的月份.先不谈炎热的天气,对于新生来说,八月意味着军训: 而对于高二高三的同学来说,八月意味着 ...

最新文章

  1. IDEA 设置泛型检查
  2. centos8 装docker 问题
  3. 复制网页中的表格格式后导入到excel、markdown、数据库、json中,并转换表格格式
  4. 有关风向及风向处理的笔记
  5. DODAF2.0之能力视角如何落地
  6. 直播APP源码功能详解
  7. 基于51单片机+ESP-01WIFI模块LED灯的控制
  8. mac 自带画图软件(mac 打开预览)
  9. 乐优商城(17)--评论服务
  10. 磁盘管理查看内存软件——WizTree使用
  11. 清华大学 IPV6 设置
  12. Image Caption 常用评价指标
  13. app标签栏android,Android Navigation TabBar控件实现多彩标签栏
  14. 三国志战略版:四大阵营武将总结——魏国篇
  15. 基于 Creator 3.0 的 3D 换装
  16. php mds函数,MDSRank类解析 - linux_hunter的个人页面 - OSCHINA - 中文开源技术交流社区...
  17. java 载入类的三种方法
  18. php货币符号怎么打,Magento修改货币符号和货币符号的位置
  19. 基于GD32实现CS5530电子秤称重方案及驱动
  20. The file contains a character that cannot be represented in the current code page.c1070

热门文章

  1. 去除html双击后选中有蓝色背景
  2. 积目服务器维护,搭建经济高效的制作网络服务器群试验平台
  3. jQuery子页面刷新父页面--局部刷新+整体刷新
  4. 固定码率(CBR)与可变码率(VBR)
  5. 【财经期刊FM-Radio|2021年03月04日】
  6. python图片镜像翻转_python图像处理之镜像实现方法
  7. 微信小程序订单生成支付二维码接口 code
  8. dp什么意思java_%~dp0是什么意思
  9. 【转】互操作性的区块链系统设计理念
  10. 用matlab解决多重共线性问题,几种关于多重共线性回归问题的解决方法