Codeforces Round #554 (Div. 2) 1152C. Neko does Maths

Posted --chenshou--

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #554 (Div. 2) 1152C. Neko does Maths相关的知识,希望对你有一定的参考价值。

学了这么久,来打一次CF看看自己学的怎么样吧

too young too simple

1152C. Neko does Maths

题目链接:"https://codeforces.com/contest/1152/problem/C"

题目大意:给你两个数a,b,现在要你找出一个数k使得(a+k)和(b+k)的最小公倍数最小。

题目思路:暴力(逃)

这题没得思路,想了想既然求LCM了那么和GCD说不定有点关系

然后就没有然后了

比赛的时候交了一发暴力上去,然并软

赛后补题,题解里面谈到了利用GCD求LCM(想对了???)

首先你要知道一件事情:gcd(a+k,b+k)=gcd(b-a,a+k) ← (gcd(a,b)=gcd(b-a,a)) ← (gcd(a,b)=gcd(b%a,a))

然后就可以发现枚举(b-a)的因子来反求k即可

代码如下


#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstdlib>

using namespace std;


int main()

    long long a,b,aa,bb;
    long long lcm,mainn=9e18,ans_k=0;
    cin>>a>>b;
    if(a>b)swap(a,b);
    long long int c=b-a;
    for(long long i=1;i*i<=c;i++)
            int k1=(int)ceil((double)a/(double)i)*i-a;
            int k2=(int)ceil((double)b/(double)i)*i-b;
            lcm=(a+k2)*(b+k2)/__gcd((a+k2),(b+k2));
            //cout<<lcm<<"fuck_\n";
            if(lcm<mainn)
                mainn=lcm;
                ans_k=k2;
            
            int ii=c/i;
            k1=(int)ceil((double)a/(double)ii)*ii-a;
            k2=(int)ceil((double)b/(double)ii)*ii-b;
            lcm=(a+k2)*(b+k2)/__gcd((a+k2),(b+k2));
            //cout<<lcm<<"fuck__\n";
            if(lcm<mainn)
                mainn=lcm;
                ans_k=k2;
            
    
    cout<<ans_k;

以上是关于Codeforces Round #554 (Div. 2) 1152C. Neko does Maths的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #554 (Div. 2) C.Neko does Maths (gcd的运用)

Codeforces Round #554 (Div. 2) C. Neko does Maths (数论 GCD(a,b) = GCD(a,b-a))

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

Codeforces554B:Ohana Cleans Up

Codeforces 554B. Ohana Cleans Up