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

浙公网安备 33010602011771号