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;
}

猜你喜欢

转载自www.cnblogs.com/--ChenShou--/p/11104683.html
今日推荐