zoukankan      html  css  js  c++  java
  • codeforces#1152C. Neko does Maths(最小公倍数)

    题目链接:

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

    题意:

    给出两个数$a$和$b$

    找一个$k(kgeq 0)$得到最小的$LCM(a+k,b+k)$

    如果有多个$k$,输出最小的$k$

    数据范围:

    $1 le a, b le 10^9$

    分析: 

    假设 $gcdleft (  a+k,b+k ight )= t$

    那么$(a+k)\%t=(b+k)\%t=0$

    化简得到$a\%t=b\%t$

    $a-x imes t=b-y imes t$($x,y$为任意整数)

    化简得到$frac{a-b}{y-x}=t$

    所以$t$一定是$a-b$的因数 

    然后枚举所有$t$,找到最小的$LCM$

    ac代码:

    #include<bits/stdc++.h>
    #define ll long long
    #define pa pair<int,int>
    #define mak make_pair
    using namespace std;
    const int maxn=1e6+10;
    const int maxm=1e7+10;
    const ll INF=1e18;
    ll ans,a,b;
    int ansk=0;
    void cal(int i)
    {
        int k=i-a%i;
        k%=i;
        if((a+k)*(b+k)/i<ans)
        {
            ans=(a+k)*(b+k)/i;
            ansk=k;
        }
    }
    int main()
    {
        scanf("%lld %lld",&a,&b);
        ans=a*b;
        ansk=0;
        if(a>b)swap(a,b);
        for(int i=1; i*i<=(b-a); i++)
        {
            if((b-a)%i==0)
            {
                cal(i);
                cal((b-a)/i);
            }
        }
        printf("%d
    ",ansk);
        return 0;
    }
    

      

  • 相关阅读:
    JZOJ.2117. 【2016-12-30普及组模拟】台风
    团队合作
    长沙游记
    统计
    html....
    OI之路
    三鑫普及组模拟赛
    牛顿迭代法
    台风
    gcd
  • 原文地址:https://www.cnblogs.com/carcar/p/10770091.html
Copyright © 2011-2022 走看看