Educational Codeforces Round 139 (Rated for Div. 2)

D.Lucky Chains

gcd=差分gcd gcd(x+k,y+k)=gcd(x+k,y-x)
也就要找最小的k,使a=gcd(x+k,y-x)!=1
这个里面y-x是固定的,枚举y-x的约数a,求min{a-x%a}。只需要枚举y-x的质因数a,因为%b0必然有%b的约数0

#include<bits/stdc++.h>
using namespace std;

const int N=10000010;
int mp[N];int prime[1000010];int tot_prime;
void sieve(){
    for(int i=2;i<N;i++){
        if(!mp[i]){mp[i]=i;prime[++tot_prime]=i;}
        for(int j=1;j<=tot_prime&&i*prime[j]<N;j++){
            mp[i*prime[j]]=prime[j];
            if(i%prime[j]==0){break;}
        }
    }
}



signed main(){
    std::ios::sync_with_stdio(false);
    sieve();
    
    int T;cin>>T;
    while(T--){
        int x,y;cin>>x>>y;
        if(y==x+1){
            cout<<-1<<'\n';continue;
        }
        if(gcd(x,y)!=1){
            cout<<0<<'\n';continue;
        }
        y-=x;
        int ans=0x3f3f3f3f;
         while (y> 1) {
        int p = mp[y];y/=p;
        ans = min(ans, p-x%p);
        }
        cout<<ans<<'\n';
    }
}
posted @ 2025-08-24 09:04  arin876  阅读(9)  评论(0)    收藏  举报