头一次遇到高维前缀和的题目 所以赛时不太会写。

\(n\cdot Mx\cdot log\)的暴力做法这里不再赘述。

容易想到随机一个数字 然后其有\(\frac{1}{2}\)的概率在答案的集合中。

如果在答案集合中枚举这个数字的所有因子那么其中的一个就是答案 判定是这个因子的倍数的个数有多少个即可。

随机k次错误的概率为\(\frac{1}{2^k}\)所以正确性还是很稳的。

考虑如何进行判定 可以将所有数字和当前数字取gcd 然后gcd的那个数字的所有因数都可以加1.

利用高维前缀和 把p当做维度做就行了。

code bf:
//#include<bits\stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define gi(x) scanf("%lf",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define gc(a) scanf("%s",a+1)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE int i=n;i>=p;--i)
#define vep(p,n,i) for(RE int i=p;i<n;++i)
#define pii pair<int,int>
#define mk make_pair
#define RE register
#define P 1000000007
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define EPS 1e-9
#define sq sqrt
#define S second
#define F first
#define op(x) t[x].op
#define d(x) t[x].d
#define Set(a,v) memset(a,v,sizeof(a))
#define pf(x) ((x)*(x))
#define mod 19991207
using namespace std;
char buf[1<<15],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;RE char ch=getc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
return x*f;
}
const int MAXN=200010;
int n,cnt,ans=1;
int vis[MAXN],a[MAXN];
inline void check(int x)
{
if(x<=ans)return;
int cnt=0;
rep(1,n,i)
{
if(a[i]%x==0)++cnt;
if(n-i+cnt<n/2)return;
}
if(cnt>=n/2)ans=x;
}
inline void solve(int x)
{
for(int i=2;i*i<=x;++i)
{
if(x%i==0)
{
check(i);
if(x/i!=i)check(x/i);
}
}
}
int main()
{
freopen("apple.in","r",stdin);
freopen("apple.out","w",stdout);
db st=clock();
get(n);srand(time(0));
rep(1,n,i)get(a[i]);
while(clock()-st<900)
{
int x=rand()%n+1;
if(vis[x])continue;
vis[x]=1;solve(a[x]);
}
put(ans);
return 0;
}
code sol:
//#include<bits\stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define gi(x) scanf("%lf",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define gc(a) scanf("%s",a+1)
#define rep(p,n,i) for(RE ll i=p;i<=n;++i)
#define go(x) for(ll i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE ll i=n;i>=p;--i)
#define vep(p,n,i) for(RE ll i=p;i<n;++i)
#define pii pair<ll,ll>
#define mk make_pair
#define RE register
#define P 1000000007
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define EPS 1e-9
#define sq sqrt
#define S second
#define F first
#define op(x) t[x].op
#define d(x) t[x].d
#define Set(a,v) memset(a,v,sizeof(a))
#define pf(x) ((x)*(x))
#define mod 19991207
using namespace std;
char buf[1<<15],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline ll read()
{
RE ll x=0,f=1;RE char ch=getc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
return x*f;
}
const ll MAXN=200010;
ll n,cnt,top;
ll vis[MAXN];
ll a[MAXN],p[MAXN],s[MAXN],L[MAXN],R[MAXN],ans=1;
map<ll,ll>H;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline void solve(ll x)
{
if(x<=ans)return;
H.clear();cnt=0;top=0;ll ww=x;
for(ll i=1;i*i<=x;++i)
{
if(x%i==0)
{
s[++cnt]=i;
if(x/i!=i)s[++cnt]=x/i;
if(ww%i==0&&i!=1)
{
p[++top]=i;
while(ww%i==0)ww/=i;
}
}
}
if(ww>1)p[++top]=ww;
rep(1,n,i)++H[gcd(a[i],x)];
rep(1,top,i)
{
ww=x/p[i];ll w1=0,w2=0;
for(ll j=1;j*j<=ww;++j)
{
if(ww%j==0)
{
L[++w1]=j;
if(ww/j!=j)R[++w2]=ww/j;
}
}
rep(1,w2,j)H[R[j]]+=H[R[j]*p[i]];
fep(w1,1,j)H[L[j]]+=H[L[j]*p[i]];
}
rep(1,cnt,i)
{
if(s[i]>ans)if(H[s[i]]>=n/2)ans=s[i];
}
}
signed main()
{
freopen("apple.in","r",stdin);
freopen("apple.out","w",stdout);
db st=clock();
get(n);srand(time(0));
rep(1,n,i)get(a[i]);ll cc=0;
while(clock()-st<900&&cc<=10)
{
ll x=rand()%n+1;
if(vis[x])continue;
vis[x]=1;solve(a[x]);++cc;
}
put(ans);//put(cc);
return 0;
}

最新文章

  1. 安装CentOS7文字界面版后,无法联网,用yum安装软件提示 cannot find a valid baseurl for repo:base/7/x86_64 的解决方法
  2. SQLSERVER单表CRUD通用方法
  3. angularjs中ng-controller中绑定对象
  4. javascript学习笔记(四):事件处理函数和动态创建html标记。
  5. 粒子系统模块(Particle System Modules40)
  6. Linux内核零碎知识
  7. springMVC找不到JS等文件
  8. IOS_问题: Xcode8 安装KSImageName插件, 编代码就崩了
  9. Python之collections序列迭代器下标式循环冒泡算法等
  10. 明星单品tab
  11. shell的输入和输出
  12. C语言复习6_doWhile循环
  13. POJ1321 棋盘问题(简单搜索)
  14. phpmailer发送邮件
  15. js运用2
  16. HBase基础之常用过滤器hbase shell操作
  17. DES加解密 cbc模式 的简单讲解 &amp;&amp; C++用openssl库来实现的注意事项
  18. elasticsearch安装ik分词器(非极速版)
  19. 反编译APK文件的三种方法(转)
  20. 转:HL7 Tools suite

热门文章

  1. fastjson到底做错了什么?为什么会被频繁爆出漏洞?
  2. 如何更换Windows中命令提示符(cmd)中的字体
  3. djangorestframework学习1-通过HyperlinkedModelSerializer,ModelViewSet,routers编写第一个接口
  4. JVM 专题八:运行时数据区(三)虚拟机栈
  5. python数据处理(九)之自动化与规模化
  6. java 基本语法(十) 数组(三) 二维数组
  7. python生成器原理剖析
  8. Spring Boot中Tomcat是怎么启动的
  9. Ant-Design-Vue中关于Table组件的使用
  10. system.out.println从什么方向执行