CF1152C. Neko does Maths

CF1152C
http://codeforces.com/contest/1152/problem/C

大意:给两个数a,b。让你找一个k,使得a+k与b+k的最小公倍数尽可能小,输出k
思路: gcd(a,b) = gcd(b,a-b),最终得到的A,B,他们的gcd一定是a-b的因子

#include <bits/stdc++.h>
using namespace std;

// gcd(a,b) = gcd(b,a-b); -> (a-b)%gcd(a,b)==0
long long a,b,diff;
vector<long long> v;
int main(){
    cin>>a>>b;
    if(a>b)swap(a,b);
    diff = b-a;

    if(diff==0){
        cout<<0<<endl;
        goto _end;
    }
    long long ac,temp;
    ac=0,temp=diff+7;
    for(long long i=1;i*i<=diff;++i){ //枚举因子
        if(diff%i==0){
           v.push_back(i);
           v.push_back(diff/i);
        }
    }
    sort(v.begin(),v.end());
    int pos;
    pos = lower_bound(v.begin(),v.end(),a)-v.begin();
    if(pos<v.size()){
        ac = v[pos];
    }else
    while(ac<a){
        ac += diff; //如果上面没找见>=a的因子,那么找diff的倍数直到>=a
    }
    cout<<ac-a<<endl;

_end:
    return 0;
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 基本运算 取模(mod)取余(rem) 定义 给定一个正整数p,任意一个整数n,一定存在等式 : n = kp +...
    passwd_阅读 1,611评论 0 3
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,392评论 0 2
  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,813评论 0 23
  • 幼儿园中班体育游戏:连体人 有益的学习经验: 学习与同伴合作同共同做好一件事,体会协作游戏的快乐。 准备:报纸若干...
    星空之下王凤琴阅读 671评论 0 3
  • 感赏儿子一天很乖顺,自觉。早晨希望他早点起床,他很不愿意,没有按照昨晚的约定去做,我很不高兴,后来及时抽离,...
    金色阳光魏艳春阅读 274评论 0 0