猜数游戏
Description
给定正整数
n
,
1、数列长度为
2、对于数列中的每个元素,它有
p
的概率为
给定正整数
n
,
Data Constraint
n=
5∗103
,
m
=
Solution
随机选出两个数
x
,
假设这两个数是由
a
生成的,设
x′
和
y′
互质的概率是大于
6π2
,所以我们就索性当
a
为
接下来就将一定不能由
a
生成的数求
时间复杂度期望
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,j,l) for(int i=j;i<=l;++i)
#define fd(i,j,l) for(int i=j;i>=l;--i)
using namespace std;
typedef long long ll;
const ll N=52e2;
int type,t,n,j,k,l,i;
ll a[N],m;
inline ll read()
{
ll o=0; char ch=' ';
for(;ch<'0'||ch>'9';ch=getchar());
for(;ch>='0'&&ch<='9';ch=getchar())o=o*10+ch-48;
return o;
}
ll gcd(ll a,ll b)
{return (b)?gcd(b,a%b):a;}
int main()
{
srand(1237654);
cin>>type>>t;
fo(tt,1,t){
cin>>n>>m;
fo(i,1,n)a[i]=read();
ll d=a[1]; int alright=1;
fo(i,1,n)d=gcd(a[i],d);
fo(i,1,n)a[i]=a[i]/d,alright&=(a[i]<=m);
if(alright){
printf("%lld %lld\n",d,d);
continue;
}
fo(i,1,n/4){
int k=rand()%n+1,p=rand()%n+1;
swap(a[p],a[k]);
}
ll ans1,ans2;
while(true){
int k=rand()%n+1,v=rand()%n+1;
while(v==k)v=rand()%n+1;
ll w1=gcd(a[v],a[k]),w2=0,ok=0;
if(w1*d>m)continue;
ll con=w1*m;
fo(i,1,n)if((a[i]%w1)||a[i]>con)w2=gcd(a[i],w2);
w2=w2==0?w1:w2;
if(w2*d>m)continue;
ll uyt=w2*m;
fo(i,1,n)if(((a[i]%w1)||(a[i]>con))&&(a[i]>uyt))
{ok=1; break;}
if(!ok){
ans1=w1; ans2=w2; break;
}
}
printf("%lld %lld\n",ans1*d,ans2*d);
}
}