Codeforces Round #554 (Div. 2) C 数论
2024-09-06 09:22:04
https://codeforces.com/contest/1152/problem/C
题意
a和b,找到k,使得lcm(a+k,b+k)最小(a,b:1e9)
题解
- 设gcd=gcd(a+k,b+k)且\(a<b\),即(a+k)%gcd=0,(b+k)%gcd=0,(a+k)%gcd=(b+k)%gcd,a%gcd=b%gcd
- 移项得b%gcd-a%gcd=0,(b-a)%gcd=0
- 枚举b-a的因数即gcd,维护最小值
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a,b,ans,ansk,k,tp,x;
int main(){
scanf("%lld%lld",&a,&b);
if(a>b)swap(a,b);
ans=a/__gcd(a,b)*b;
ansk=0;
for(ll i=1;i*i<=(b-a);i++){
//cout<<i<<endl;
if((b-a)%i)continue;
x=i;
if(a%x!=b%x)continue;
if(a%x){
k=x-a%x;
tp=(a+k)/__gcd(a+k,b+k)*(b+k);
if(tp<ans){
ans=tp;ansk=k;
}else if(tp==ans&&k<ansk){
ansk=k;
}
}
x=(b-a)/i;
if(a%x!=b%x)continue;
if(a%x){
k=x-a%x;
tp=(a+k)/__gcd(a+k,b+k)*(b+k);
if(tp<ans){
ans=tp;ansk=k;
}else if(tp==ans&&k<ansk){
ansk=k;
}
}
}
printf("%lld",ansk);
}
最新文章
- 引水入城(codevs 1066)
- ci总结
- js 事件函数中的参数带换行符或换行标签都不能起作用的解决方法
- 由浅入深了解Thrift之结果封装
- 【学习】Windows PE文件学习(一:导出表)
- BNU 51276 - 道路修建 Small (并查集)
- JAVA泛型编程笔记
- class 类(2)
- c#超时锁定
- js原生设计模式——2面向对象编程之闭包2
- 程序员的自我救赎---11.4:FileSystem文件服务
- sqlserver数据库不能重命名报错5030——我的一点小思考
- java课程之团队开发冲刺1.2
- libreoffice python 操作word及excel文档
- android 控件获取 获取焦点
- laravel创建新的提交数据
- EXCEL workbook.saveas 函数详解
- 星号三角形 I python
- Windows Service 之 Bug 记录
- 【Unity】4.7 摄像机