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';
}

全部评论
出题人的本意就是让你不去预处理所有数的因数,因为这个做法看起来可行但常数很大,所以卡了空间。
点赞 回复 分享
发布于 10-19 20:41 广东

相关推荐

面了100年面试不知...:今年白菜这么多,冬天可以狂吃了
点赞 评论 收藏
分享
活泼的代码渣渣在泡池...:哈哈哈挺好的,我也上岸美团了,不说了,我又接了一单
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务