题意:给定两个数x,y,求k的最大值使得gcd(x+[1,k],y+[1,k])=1。
思路:首先有个关键的结论:
gcd(x,y)=gcd(x,y−x)
那么由此可以推出:
gcd(x+k,y+k)=gcd(x+k,y+k−(x+k))=gcd(x+k,y-x)。
又因为y-x是定值,所以我们只需要对y-x进行质因子分解,对于y-x的每个质因子,求出第一个大于x且是该质因子倍数的数,我们设这个数为p,则k=p-x,每次k取min即可。
const int maxn = 1e7 + 5;
int prime[maxn];
void init() {
for (int i = 2; i < maxn; i++)
if (!prime[i])
for (int j = i; j < maxn; j += i) prime[j] = i;
}
void solve() {
int x, y, ans = inf;
cin >> x >> y;
for (int d = y - x; d > 1; d /= prime[d])
ans = min(ans, ((x - 1) / prime[d] + 1) * prime[d] - x);//x-1是为了特判ans=1的情况
cout << (ans == inf ? -1 : ans) << endl;
}