#include<bits/stdc++.h>
#define For(i,l,r) for(int i=l;i<=r;i++)
#define Rof(i,l,r) for(int i=l;i>=r;i--)
using namespace std;
char buf[100],*p1=buf,*p2=buf;
inline int gc(){ return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100,stdin),p1==p2)?EOF:*p1++; }
inline int input(){
int x=0; char ch=gc(); bool f=1;
while(!isdigit(ch)) f^=ch=='-',ch=gc();
while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=gc();
return f?x:-x;
}
const int M = 1012345;
const int N = 301234;
int n,k,a[N];
bitset<M> hav;
int sum[N];
int ma[M],mi[M];
signed main(){
string str("gcd");
freopen((str+".in").c_str(),"r",stdin);
freopen((str+".out").c_str(),"w",stdout);
memset(mi,0x3f,sizeof(mi));
n=input(),k=input();For(i,1,n){
a[i]=input();
ma[a[i]]=max(ma[a[i]],i);
mi[a[i]]=min(mi[a[i]],i);
hav[M-a[i]]=true;
}int i,p,w;
for(i=hav._Find_first();M-i<=M;i=hav._Find_next(i)){
p=M-i;if(ma[p]-mi[p]>=k) return cout<<p<<'\n',0;
int q=(int)sqrt(p);
for(int j=2;j<=q;++j){
if(p%j==0){w=p/j;
ma[j]=max(ma[j],ma[p]);
mi[j]=min(mi[j],mi[p]);
ma[w]=max(ma[w],ma[p]);
mi[w]=min(mi[w],mi[p]);
hav[M-j]=true,hav[M-w]=true;
}
}
}return 0;
}
题解代码
还是把题解的加上吧,题解是正着来的。
#include <iostream>
#include <cstdio>
#define maxn 1000000
using namespace std;
int n,k,a[300005];
int mn[1000005],mx[1000005];
int ans;
int main(){
freopen("gcd.in","r",stdin);
freopen("gcd.out","w",stdout);
scanf("%d%d",&n,&k);
for (int i=1;i<=maxn;i++)mn[i]=n+1,mx[i]=0;
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
mn[a[i]]=min(mn[a[i]],i);
mx[a[i]]=max(mx[a[i]],i);
}
for (int i=1;i<=maxn;i++){
int l=n+1,r=0;
for (int j=i;j<=maxn;j+=i){
l=min(l,mn[j]);
r=max(r,mx[j]);
}
if (r-l>=k)ans=i;
}
printf("%d\n",ans);
return 0;
}