学了这么久,来打一次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
时间: 2024-10-09 04:13:45