Codeforces Round #554 (Div. 2) C. Neko does Maths (簡單推導)
阿新 • • 發佈:2019-04-25
mes def color gcd names clu oid span nbsp
題目: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> #definemaxn 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 (簡單推導)