Codeforces Round #554 (Div. 2) C 数论

匿名 (未验证) 提交于 2019-12-02 23:33:01

https://codeforces.com/contest/1152/problem/C

a和b,找到k,使得lcm(a+k,b+k)最小(a,b:1e9)

  • 设gcd=gcd(a+k,b+k)且\(a<b\),即(a+k)%gcd=0,(b+k)%gcd=0,(a+k)%gcd=(b+k)%gcd,a%gcd=b%gcd
  • 移项得b%gcd-a%gcd=0,(b-a)%gcd=0
  • 枚举b-a的因数即gcd,维护最小值
#include<bits/stdc++.h> #define ll long long  using namespace std; ll a,b,ans,ansk,k,tp,x; int main(){     scanf("%lld%lld",&a,&b);     if(a>b)swap(a,b);     ans=a/__gcd(a,b)*b;     ansk=0;     for(ll i=1;i*i<=(b-a);i++){        //cout<<i<<endl;         if((b-a)%i)continue;         x=i;        if(a%x!=b%x)continue;        if(a%x){            k=x-a%x;            tp=(a+k)/__gcd(a+k,b+k)*(b+k);            if(tp<ans){                ans=tp;ansk=k;            }else if(tp==ans&&k<ansk){                ansk=k;            }        }        x=(b-a)/i;        if(a%x!=b%x)continue;        if(a%x){            k=x-a%x;            tp=(a+k)/__gcd(a+k,b+k)*(b+k);            if(tp<ans){                ans=tp;ansk=k;            }else if(tp==ans&&k<ansk){                ansk=k;            }        }      }     printf("%lld",ansk); }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!