BZOJ3837: [Pa2013]Filary
当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相关推荐
- BZOJ3837 : [Pa2013]Filary
当m取2时,k至少为$\frac{n}{2}$ 所以在最优解中每个数被选中的概率至少为$\frac{1}{2}$ 每次随机选取一个位置i,计算出其它数与$a_i$的差值,将差值分解质因数 所有质因数中 ...
- 【BZOJ3837】[Pa2013]Filary 随机化神题
[BZOJ3837][Pa2013]Filary Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时 ...
- [BZOJ3837][Pa2013][随机][乱搞]Filary
然而我太懒了--没有打哈希. 直觉告诉我第二个答案是选择的k个数的差的gcd,那么对于每一个质因数,记录一下序列中能被这个质数整除的差的gcd,然后就可以了 #include <cstdio&g ...
- 【PA2013】【BZOJ3837】Filary
Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时的m.如果有多组解使得k最大,你要在此基础上求出m ...
- bzoj 3837 pa2013 Filary
bzoj 先搞第一问.考虑简单情况,如果\(m=2\),那么一定有个剩余类大小\(\ge \lceil\frac{n}{2}\rceil\),同时这也是答案下界 然后我们每次随机选出一个数\(a_i\ ...
- bzoj 3837 (随机过题法了解一下)
3837: [Pa2013]Filary Time Limit: 60 Sec Memory Limit: 256 MB Submit: 395 Solved: 74 [Submit][Statu ...
- bzoj 3838: [Pa2013]Raper (线段树)
3838: [Pa2013]Raper Time Limit: 60 Sec Memory Limit: 128 MB Submit: 53 Solved: 27 [Submit][Status] ...
- BZOJ3838 : [Pa2013]Raper
将选取的$A$看成左括号,$B$看成右括号,那么答案是一个合法的括号序列. 那么只要重复取出$k$对价值最小的左右括号,保证每时每刻都是一个合法的括号序列即可. 将$($看成$1$,$)$看成$-1$ ...
- luogu P4694 [PA2013]Raper
https://www.luogu.com.cn/problem/P4694 首先可以用wqswqswqs二分去掉KKK的那个限制 然后可以发现剩下的就是一个模拟费用流了 code: #include ...
最新文章
- Oozie 3.3.1安装
- JNI学习-- C调用java方法
- 【工具向】分析FGUI依赖关系工具
- dos2unix命令
- 设置谷歌浏览器的flash 插件
- 用Python在地图上模拟疫情扩散
- UBUNTU内核升级后,如何更新 kernel headers
- oracle erp系统好用么,oracleerp系统优缺点
- 社会人类学类毕业论文文献包含哪些?
- 【数据结构】循环队列的front,rear指针以及队列满的条件、计算队列长度
- 利用Python实现校园网自动登录(部署在树莓派)
- 大数据Spark(三十九):SparkStreaming实战案例四 窗口函数
- WARN Error while fetching metadata with correlation id 5 : {testtopic=LEADER_NOT_AVAILABLE}
- 郑州大学计算机系王院长,郑州大学徐明亮教授、北京航天航空大学牛建伟教授来校开展学术交流...
- [面试]机器学习面试常见问题
- tsv文件与csv文件的区别以及如何转换
- 感受美国小学生的幸福校园生活! (转)
- npm run dev卡住
- Teddy van Jerry 的导航页
- SAP ABAP 接口开发(RFC,IDOC,Webservice,Native SQL)
热门文章
- MY云顶之奕上分阵容
- JAVA WEB 入门基础第一天
- java中冒号的用法
- zipentry java_java.util.zip 类 ZipEntry - Java 中文参考手册
- Java SSLSocket客户端认证配置
- Pat(Advanced Level)Practice--1054(The Dominant Color)
- 论文阅读 | Bringing a Blurry Frame Alive at High Frame-Rate with an Event Camera
- 矩阵分析:Kronecker积,Hadamard积
- 两台计算机互联方案,如何让两台电脑直接用网线互联.docx
- IAR Systems