1. 程式人生 > >Codeforces Round #554 (Div. 2) C. Neko does Maths (簡單推導)

Codeforces Round #554 (Div. 2) C. Neko does Maths (簡單推導)

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>
#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 (簡單推導)