博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces:1152C(math)
阅读量:4060 次
发布时间:2019-05-25

本文共 1044 字,大约阅读时间需要 3 分钟。

Euclidean Algorithm:

找lsm(a+k,b+k)等同于找gcd(a+k,b+k)
其中:
gcd(a+k,b+k) = gcd(a+k,b-a)
枚举b-a所有因子即可,通过因子找a+k,然后再找k

#include
using namespace std;#define LL long longLL a,b;LL minlsm,mink;void doit(LL i){ // 找到 大于 a 且是 i 的最小倍数,即 a+k LL aa = ( a + i - 1) / i * i; // 找到 大于 b 而且 i 的最小倍数,即 b+k LL bb = ( b + i - 1) / i * i; /* 这里要说明,根据Euclidean Algorithm, gcd( a+k , b+k ) = gcd( a+k , b-a ) 此时 aa = a + k , bb = b + k 的k一定是同一个k */ // 计算最小公倍数 LL lsm = aa * bb / i; // 计算k LL k = aa - a; // 更新答案 if( lsm < minlsm || (lsm == minlsm && k < mink)){ minlsm = lsm; mink = k; }}int main(){ scanf("%I64d%I64d",&a,&b); if(b < a) swap(a,b); minlsm = a*b; mink = minlsm - a; LL c = b - a; if(c == 0){ printf("0\n"); return 0; } // gcd( a+k , b+k ) = gcd( a+k , b-a ) // b-a 不能为0 // 枚举 b-a 的所有因子 for(int i=1 ; i*i <= c ; i++ ){ if( c % i ) continue; // i 不是 c 的因子 doit(i); doit(c/i); } printf("%I64d\n",mink); return 0;}

转载地址:http://rfwji.baihongyu.com/

你可能感兴趣的文章
SQL语句(六) 自主存取控制
查看>>
《数据库系统概论》 第六章 关系数据理论
查看>>
《数据库系统概论》 第七章 数据库设计
查看>>
SQL语句(七)实体完整性
查看>>
SQL语句(八)参照完整性
查看>>
SQL语句(九)用户自定义完整性
查看>>
数据库复习(八)——Transact-SQL程序设计
查看>>
数据库复习(九)——存储过程
查看>>
数据库复习(十)——触发器
查看>>
Python入门(二)开发环境的搭建以及集成开发环境pycharm的安装
查看>>
Python入门(四)使用Python实现简单的通讯录(1.0版本)
查看>>
操作系统复习(一) 概述——操作系统设计目标 发展 分类 功能 特征
查看>>
操作系统复习(二)——进程的概念 特征 状态及转换 控制 同步及典型问题 通信
查看>>
《计算机网络》第四章 网络层 ——分类的IP 划分子网 构成超网 路由选择协议 路由器构成
查看>>
《计算机网络》第五章 运输层 ——TCP和UDP 可靠传输原理 TCP流量控制 拥塞控制 连接管理
查看>>
操作系统复习(三)处理机调度——三级调度体系 调度算法 死锁的概念及处理 c语言实现银行家算法
查看>>
线性代数(一)线性方程组与矩阵——高斯消元法 矩阵的初等变换
查看>>
线性代数(二)矩阵的行列式——行列式的计算 初等变化性质 矩阵的秩
查看>>
线性代数(三)矩阵代数——矩阵的乘法 逆矩阵定义以及求解
查看>>
线性代数(四)n维向量
查看>>