B题
空间卡这么死干啥
x=k-y+g
暴力求解x,用gcd(x,y)==g判断,整体双指针
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1081080;
vector<int> yz[N+1];
bitset<N+1> mark;
int a[N+1];
int n,k;
vector<int> getx(int y){
int gg=__gcd(k,y);
vector<int> ret;
for(auto g:yz[gg]){
if(__gcd(y,k+g-y)==g){
ret.push_back(k+g-y);
}
}
return move(ret);
}
bool check(int y){
if(y==k)return false;
if(y>k)return true;
for(auto x:getx(y)){
if(mark[x])return false;
}
return true;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int ans=0;
cin>>n>>k;
for(int i=1;i<=n;i++){
ll tmp;
cin>>tmp;
if(tmp>k)tmp=k+1;
a[i]=tmp;
if(a[i]<=k)mark[__gcd(k,a[i])]=1;
}
for(int i=1;i<=N;i++){
for(int j=i;j<=N;j+=i){
if(mark[j])yz[j].push_back(i);
}
}
mark.reset();
int r=1;
for(int l=1;l<=n;l++){
if(l>r)r=l;
while(r<=n&&check(a[r])){
mark[a[r]]=1;
r++;
}
ans=max(ans,r-l);
if(l<r)mark[a[l]]=0;
}
cout<<ans<<'\n';
}
科大讯飞公司氛围 474人发布