【BZOJ3837】[Pa2013]Filary 随机化神题
【BZOJ3837】[Pa2013]Filary
Description
Input
Output
Sample Input
7 4 10 8 7 1
Sample Output
题解:我们随机选取一个数x,然后将所有数与它作差,那么只需要找出k个差值使得他们的gcd>1即可。我们可以将所有差值分解质因数,然后统计每个质因数出现的次数,再加上与x相等的数的个数就是k。统计k个时候顺便记录一下这些数的gcd即可。
本题还有一个特殊性质,当m=2时,k一定>n/2。所以我们期望随机log次就能得到一个选中的数了。(实际情况根据随机的种子而定,一开始自己设的种子要么奇慢无比,要么WA,后来把种子去掉,随机4次就行了。)
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
const int maxn=100010;
int n,x,nk,nm,k,m,num;
int pri[1000010],lp[10000010],s[1000010],g[1000010];
bool np[10000010];
int v[maxn],c[maxn];
int rd()
{
int ret=0; char gc=getchar();
while(gc<'0'||gc>'9') gc=getchar();
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret;
}
int gcd(int a,int b)
{
return (!b)?a:gcd(b,a%b);
}
int main()
{
int i,j,T;
for(i=2;i<=10000000;i++)
{
if(!np[i]) pri[++num]=i,lp[i]=num;
for(j=1;j<=num&&i*pri[j]<=10000000;j++)
{
np[i*pri[j]]=1,lp[i*pri[j]]=j;
if(i%pri[j]==0) break;
}
}
n=rd();
for(i=1;i<=n;i++) v[i]=rd();
for(T=1;T<=4;T++)
{
x=v[rand()%n+1];
for(s[0]=0,i=1;i<=n;i++)
{
c[i]=abs(v[i]-x);
if(!c[i]) s[0]++;
}
nk=0;
for(i=1;i<=n;i++)
{
int t=c[i];
while(t&&t!=1)
{
int tmp=lp[t];
s[tmp]++,g[tmp]=gcd(g[tmp],c[i]);
if(nk<s[tmp]+s[0]) nk=s[tmp]+s[0],nm=0;
if(nk==s[tmp]+s[0]) nm=max(nm,g[tmp]);
while(t%pri[tmp]==0) t/=pri[tmp];
}
}
if(nk>k) k=nk,m=0;
if(nk==k) m=max(m,nm);
for(i=1;i<=n;i++)
{
int t=c[i];
while(t&&t!=1)
{
int tmp=lp[t];
s[tmp]=g[tmp]=0;
while(t%pri[tmp]==0) t/=pri[tmp];
}
}
}
printf("%d %d",k,m);
return 0;
}
【BZOJ3837】[Pa2013]Filary 随机化神题的更多相关文章
- Bzoj3837 [Pa2013]Filary(随机化)
题面 权限题 题解 这题有一个很好的性质,就是一定有$k>\frac n2$.接着考虑怎么做. 我们随机选取一个数$x$,然后将所有数与它作差,那么只需要找出$k$个差值使得他们的最大公因数大于 ...
- BZOJ3837 : [Pa2013]Filary
当m取2时,k至少为$\frac{n}{2}$ 所以在最优解中每个数被选中的概率至少为$\frac{1}{2}$ 每次随机选取一个位置i,计算出其它数与$a_i$的差值,将差值分解质因数 所有质因数中 ...
- 【BZOJ3837】[PA2013]Filary
[BZOJ3837][PA2013]Filary 题面 darkbzoj 题解 考虑到模数为\(2\)时答案至少为\(\frac n2\),这是我们答案的下界. 那么我们对于任意的一个数,它们答案集合 ...
- bzoj 3837 (随机过题法了解一下)
3837: [Pa2013]Filary Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 395 Solved: 74[Submit][Status] ...
- B4010 菜肴制作 拓扑排序(附随机跳题代码)
今天写了一个自己的随机跳题小程序,第一次试发现跳的全是不可做题,但是在周围我一眼看见了这个题,不能说一眼看出来,但是也是比较有思路,所以就做他了! 做得比较顺利,做完之后美滋滋,突然发现样例第三组过不 ...
- ppt VBA 实现随机抽题
目录 目标/最终效果 关于VBA VBA简单示例 检查环境 步骤 VBA实现随机抽题 todo challenge 目标/最终效果 目标是制作一个ppt,实现随机抽题,具体描述: 第一页幻灯片中:点击 ...
- bzoj 3837 pa2013 Filary
bzoj 先搞第一问.考虑简单情况,如果\(m=2\),那么一定有个剩余类大小\(\ge \lceil\frac{n}{2}\rceil\),同时这也是答案下界 然后我们每次随机选出一个数\(a_i\ ...
- 软件工程课程作业(一)—20道随机四则运算题(C++)
一.编程思想: 1.定义所需要变量2.设置数组,存储运算符,3.通过随机函数random(0,100)找出运算数,random(0,4)找出运算符4.通过输出显示运算式. 二.源代码: //2016 ...
- [BZOJ5361][Lydsy1805月赛]对称数
bzoj Description 给你一棵树,每个点有一个编号\(a_i\).\(Q\)组询问,每次问一条路径上最小的出现了偶数次的编号是多少(包括零次). 多组数据,\(T\le10,n,Q,a_i ...
随机推荐
- Pebbles(hdu 2167)
题意:给定一个N*N的方格,让你在里面取出一些数使其和最大,要求每一个数不能与其相邻的8个数同时取出. /* 和hdu1565差不多,只不过在更新的时候考虑斜上方的格子对该格子的影响. */ #inc ...
- 数表(bzoj 3529)
Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a ...
- APUE 学习笔记(四) 标准I/O库
1.流与FILE对象 unix I/O系统调用都是针对文件描述符的 标准C的I/O函数都是针对流(文件指针)的,我们使用一个流与一个文件相关联 2.缓冲 标准I/O库提供缓冲的目的就是尽可能减少r ...
- UVa11021 Tribles
概率 递推 每只麻球都是独立计算的. 可以递推,设f[i]表示一只麻球经过i天死光的概率,那么f[i]的k次方就是k只麻球经过i天死光的概率. 则f[i]=p[0]+p[1]*f[i-1]^1+p[2 ...
- 标准C程序设计七---120
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- 共享内存之——mmap内存映射
共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制.共享内存可以通过mmap()映射普通文件 (特殊情况下还可以采用匿名映射)机制实现,也可以通过sy ...
- Struts+ibatis-学习总结一
1查询并返回list 别名映射->实体类:resultClass <select id=" selectAll" resultClass="AppLog&qu ...
- 备份MySQL数据库的方法
前言 我们试着想一想, 在生产环境中什么最重要?如果我们服务器的硬件坏了可以维修或者换新, 软件问题可以修复或重新安装, 但是如果数据没了呢?这可能是最恐怖的事情了吧, 我感觉在生产环境中应该没有什么 ...
- python 之 线程池实现并发
使用线程池实现高IO并发 模块:ThreadPoolExecutor, as_completed 测试代码如下: #!/opt/python3/bin/python3 from concurrent. ...
- Codeforces 576D Flights for Regular Customers(矩阵加速DP)
题目链接 Flights for Regular Customers 首先按照$d$的大小升序排序 然后分成$m$个时刻,每条路径一次处理过来. $can[i][j]$表示当前时刻$i$能否走到$j ...