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)