题目:http://codeforces.com/contest/1152/problem/C
题意:给你a,b, 你可以找任意一个k 算出a+k,b+k的最小公倍数,让最小公倍数尽量小,求出这个k
思路:
因为现在两个都是未知数,我们无法确定
我们根据gcd底层实现原理
gcd(a+k,b+k) = gcd(b-a,a+k)
a=c*x;
b=c*y;
b-a=c*(y-x)
所以证明b-a的因子是a的因子也是b的因子
那么我们只要枚举出b-a的因子,然后再套入a+k中求得k,然后枚举取最优即可
#include<bits/stdc++.h> #define maxn 100005 #define mod 1000000007 using namespace std; typedef long long ll; ll a,b; ll mx; ll k; void suan(ll x) { ll kk=(x-a%x)%x; ll dx=(a+kk)/x*(b+kk); if(mx==-1) { mx=dx; k=kk; } else if(dx==mx){ k=min(k,kk); } else if(dx<mx){ mx=dx; k=kk; } } int main() { cin>>a>>b; if(a>b){ ll t=b; b=a; a=t; } mx=-1; k=-1; ll sum=0; ll z=b-a; ll t=sqrt(z); for(int i=1;i<=t;i++) { if(z%i==0) { suan(i); suan(z/i); } } cout<<max(k,(ll)0); }
Codeforces Round #554 (Div. 2) C. Neko does Maths (简单推导)
原文:https://www.cnblogs.com/Lis-/p/10770632.html