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

转载于:https://www.cnblogs.com/--ChenShou--/p/11104683.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值