gcd(a+c,b+c)!=1,求最小的c

发布时间 2023-04-23 21:57:11作者: 重生之我是菜鸟

https://ac.nowcoder.com/acm/contest/54877/E

根据更相减损法 gcd(a+c,b+c) = gcd(a-b,a+c),由于a,b已经给出,a-b为固定值。

当a-b为1时,无解

当a-b为0时,若a = 1,则c = 1,否则 c = 0

对于a-b = 其他,对a-b做质因子分解,对于每一个质因子d去求最小的c使得gcd(d,a+c)!=1,发现c = d - a%d,最后维护一个最小值即可

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,b;
signed main(){
	cin>>a>>b;
    if(a<b) swap(a,b);
    int num = a-b;
    if(num==1){
        cout<<-1;
    }
    else if(num==0){
        if(a==1) cout<<1;
        else cout<<0;
    }
    else{
        int k = num;
        int ans = 1e15;
        for(int i = 2;i*i<=num;i++){
            if(k%i==0){
                ans = min(ans,i-a%i);
            }
            while(k%i==0) {
                k/=i;
            }
        }
        if(k>1){
             ans = min(ans,k-a%k);
        }
        cout<<ans;
    }
}