rt,第一个题解的做法
#include<bits/stdc++.h>
using namespace std;
#define pii pair<long long,long long>
#define fst first
#define scd second
#define ll long long
#define ls (p<<1)
#define rs (p<<1|1)
#define maxn 500000
mt19937 rd(chrono::steady_clock::now().time_since_epoch().count());
const int N=1e6+5,M=1e7;
const ll mod=1e18+3;
ll rrand(ll L, ll R){
return rd()%(R-L+1)+L;
}
int vis[M+5],cnt[N],a[N],tim[N];
ll val[N],hsh[N];
int apr[M];
pii lgl[N];
vector<int> prim;
int n,top;
void init(){
memset(hsh,0,sizeof(hsh));
memset(cnt,0,sizeof(cnt));
memset(tim,0x3f,sizeof(tim));
top=0;
}
inline void Ins(int pos,int x,int t){
hsh[pos]^=val[x];
cnt[pos]++,tim[pos]=min(tim[pos],t);
}
pii calc(int pos){
int add=0;
for(int i=1; i<=n; i++) {
int x=abs(a[i]-a[pos]);
if(!x){
add++;
continue;
}
for(int j=0; j<prim.size(); j++){
int now=prim[j],t=0;
if(x%now==0){
while(x%now==0) x/=now,t++;
Ins(j,i,t);
}
if(vis[x]>=0) {
if(x!=1) Ins(vis[x],i,1);
break;
}
}
}
int ans=0; ll ret=0,sum=1;
for(int i=0; i<prim.size(); i++){
ll ref=1;
if(tim[i]<=100)
for(int j=1; j<=tim[i]; j++)
ref=ref*prim[i];
if(cnt[i]>ans) ans=cnt[i],top=0;
if(cnt[i]==ans) lgl[++top]=make_pair(hsh[i],ref);
// if(prim[i]<=100)cout<<prim[i]<<" "<<hsh[i]<<" "<<cnt[i]<<endl;
}
sort(lgl+1,lgl+top+1);
for(int i=1; i<=top; i++){
if(lgl[i].fst!=lgl[i-1].fst){
ret=max(ret,sum);
sum=lgl[i].scd;
}
else sum*=lgl[i].scd;
}
return make_pair(ans+add,sum);
}
int main(){
// freopen("seq3.in","r",stdin);
// freopen("my.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n;
for(int i=2; i<=M; i++){
if(vis[i]!=-1){
vis[i]=prim.size();
prim.push_back(i);
}
for(auto j : prim){
if(1ll*i*j>M) break;
vis[i*j]=-1;
if(i%j==0) break;
}
}
pii res=make_pair(0,0);
for(int i=1; i<=n; i++) cin>>a[i];
for(int i=1; i<=n; i++){
if(apr[a[i]]) val[i]=val[apr[a[i]]];
else apr[a[i]]=i,val[i]=rrand(1,1e18);
}
for(int i=1; i<=40; i++){
init();
res=max(res,calc(rrand(1,n)));
}
cout<<res.fst<<" "<<res.scd<<"\n";
}