codeforce 1152C. Neko does Maths(欧几里得算法)
Posted fy1999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforce 1152C. Neko does Maths(欧几里得算法)相关的知识,希望对你有一定的参考价值。
找到一个k使得a+k与b+k的最大公倍数lcm最小
欧几里得算法:gcd(a,b) = gcd(b,a mod b)。
gcd是b-a的除数。 让我们迭代b-a的所有除数q。 这也意味着a(modq)= b(modq)。 如果a(modq)= 0,我们可以使用k = 0。
否则,相应的k应为q-a(modq)。 最后,我们需要检查lcm(a + k,b + k)的值是否是迄今为止找到的最小值。
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll a,b; int main() { ios::sync_with_stdio(false); cin>>a>>b; ll d=abs(a-b); ll ans=0; ll h=a/__gcd(a,b)*b; if(b==a){ cout<<"0"<<endl; return 0; } else{ ll k,v; for(int i=1;i*i<=d;i++){ if(d % i != 0) continue; k=i; k=(k-(a%k))%k;//保证k为满足当前情况的最小值 v= (a+k)/__gcd(a+k,b+k)*(b+k); if(v<h){ h=v; ans=k; } if(v==h) ans=min(ans,k); k=d/i; k=(k-(a%k))%k; v= (a+k)/__gcd(a+k,b+k)*(b+k); if(v<h){ h=v; ans=k; } if(v==h) ans=min(ans,k); } cout<<ans<<endl; } return 0; }
以上是关于codeforce 1152C. Neko does Maths(欧几里得算法)的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces-1152C Neko does Maths(GCD)
codeforce 1152C. Neko does Maths(欧几里得算法)
Codeforces Round #554 (Div. 2) C.Neko does Maths (gcd的运用)
C. Neko does Maths(数论 二进制枚举因数)