传送门

题意

  给出两个正整数 a,b;

  求解 k ,使得 LCM(a+k,b+k) 最小,如果有多个 k 使得 LCM() 最小,输出最小的k;

思路

  刚开始推了好半天公式,一顿xjb乱操作;

  后来,看了一下题解,看到一个引理:

  GCD(a,b) = GCD(a,b-a) = GCD(b,b-a);

假设GCD(a,b) = c;
a%c = ;
b%c = ;
那么(b-a)%c = ;
这证明了a和(b-a),b和(b-a)有公约数c;
假设GCD(a,b-a)=c' > c;
那么,a%c' = 0;
(b-a)%c' = 0;
(b-a)%c' = b%c'-a%c';
所以 b%c' = 0;
那么GCD(a,b) = c' > c,与假设矛盾;
GCD(b,b-a)同理;
故命题得证;

简单证明

  有了这个引理后,解题思路变得异常清晰;

  首先,令 b > a;

  将 LCM(a+k,b+k) 转化一下:

  

  

  情况①,如果 a 与 b-a 不互素,那么 a+1 与 b-a 一定互素;

  情况②,a+k = x·(b-a),其中 x·(b-a) 是大于等于 a 的最小的 (b-a) 的倍数;

  情况③,枚举 b-a 的约数;

•Code

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long ll a,b; ll GCD(ll a,ll b)
{
return a == ? b:GCD(b%a,a);
}
ll LCM(ll a,ll b)
{
return a/GCD(a,b)*b;
}
ll F(ll k)
{
return (a+k)*(b+k)/GCD(a+k,b+k);
}
bool isSat(int i,ll k)//判断k是否可以更新为i-a
{
ll curK=i-a;
if(curK < || F(curK) != LCM(a+curK,b+curK))
return false;
if(F(curK) < F(k) || F(curK) == F(k) && curK < k)
return true;
return false;
}
ll Solve()
{
if(a > b)
swap(a,b);
int d=b-a;
if(d == )
return ; ll k=;
for(;GCD(d,a+k) != ;k++);///情况①
for(int i=;i*i <= d;++i)///情况③
{
if(d%i != )
continue;
if(isSat(i,k))///a+k=i
k=i-a;
if(isSat(d/i,k))///a+k=d/i
k=d/i-a;
}
///情况②,GCD()为定值,k越小LCM()就越小
ll x=(a/d+(a%d == ? :))*d;///a+k=k*d(k*d:>=a的最小的d的倍数)
if(isSat(x,k))
k=x-a; return k;
}
int main()
{
scanf("%lld%lld",&a,&b);
printf("%lld\n",Solve()); return ;
}

分割线:2019.7.23

•新想法

  GCD(b-a , a+k) = f(b-a);

  f(b-a) 表示 b-a 的约数;

  当 GCD(b-a,a+k) 确定后,k 越小则 LCM(a+k,b+k) 就越小;

  假设 GCD(b-a,a+k) = f;

  ①如果 a 本身就为 f 的倍数,且 GCD(b-a,a) = f;

  那么 k = 0 是满足当前条件下,使得 LCM(a+k,b+k) 最小的最优解;

  ②反之,如果 a 不为  f 的倍数,那么,找到 ≥ a 的最小的 x·f,并判断 GCD(b-a,x·f) ?= f;

    1)如果 GCD(b-a,x·f) = f;

      那么 k = x·f-a 是满足当前条件下,使得 LCM(a+k,b+k) 最小的最优解;

    2)如果 GCD(b-a,x·f) ≠ f;

      那么 GCD(b-a,(x+1)·f)一定等于 f;

  GCD(b-a,x·f) = GCD(y·f,x·f) = f·GCD(x,y);

  判断 GCD(b-a,x·f) ?= f ⇔ 判断 GCD(y,x) ?= 1;

  如果 GCD(y,x) ≠ 1,那么一定有 GCD(y,x+1) = 1;

•Code

 #include<bits/stdc++.h>
using namespace std;
#define GCD(a,b) __gcd(a,b)
#define ll long long ll a,b; ll g(ll k)
{
return (a+k)/GCD(a+k,b+k)*(b+k);
}
void update(ll f,ll &k)
{
ll x=a/f+(a%f != );///找到使得x·f ≥ a的最小的x
ll y=(b-a)/f; if(GCD(x,y) != )
x++; ///判断是否更新k
ll cur=x*f-a;
if(k == - || g(k) > g(cur))
k=cur;
else if(g(k) == g(cur))
k=min(k,cur);
}
ll Solve()
{
if(a == b)
return ;
if(b < a)
swap(a,b); ll k=-; for(ll i=;i*i <= b-a;++i)
{
if((b-a)%i != )
continue; update(i,k);
update((b-a)/i,k);
} return k;
}
int main()
{
scanf("%lld%lld",&a,&b);
printf("%lld\n",Solve()); return ;
}

      

Codeforces Round #554 (Div. 2) C. Neko does Maths(数学+GCD)的更多相关文章

  1. Codeforces Round #554 (Div. 2) C. Neko does Maths (简单推导)

    题目:http://codeforces.com/contest/1152/problem/C 题意:给你a,b, 你可以找任意一个k     算出a+k,b+k的最小公倍数,让最小公倍数尽量小,求出 ...

  2. Codeforces Round #554 (Div. 2) C.Neko does Maths (gcd的运用)

    题目链接:https://codeforces.com/contest/1152/problem/C 题目大意:给定两个正整数a,b,其中(1<=a,b<=1e9),求一个正整数k(0&l ...

  3. Codeforces Round #554 (Div. 2) C. Neko does Maths (数论 GCD(a,b) = GCD(a,b-a))

    传送门 •题意 给出两个正整数 a,b: 求解 k ,使得 LCM(a+k,b+k) 最小,如果有多个 k 使得 LCM() 最小,输出最小的k: •思路 时隔很久,又重新做这个题 温故果然可以知新❤ ...

  4. Codeforces Round #554 (Div. 2) 1152B. Neko Performs Cat Furrier Transform

    学了这么久,来打一次CF看看自己学的怎么样吧 too young too simple 1152B. Neko Performs Cat Furrier Transform 题目链接:"ht ...

  5. Codeforces Round #554 (Div. 2) 1152A - Neko Finds Grapes

    学了这么久,来打一次CF看看自己学的怎么样吧 too young too simple 1152A - Neko Finds Grapes 题目链接:"https://codeforces. ...

  6. Codeforces Round #554 (Div. 2) B. Neko Performs Cat Furrier Transform(思维题+log2求解二进制位数的小技巧)

    传送门 题意: 给出一个数x,有两个操作: ①:x ^= 2k-1; ②:x++; 每次操作都是从①开始,紧接着是② ①②操作循环进行,问经过多少步操作后,x可以变为2p-1的格式? 最多操作40次, ...

  7. Codeforces Round #554 (Div. 2) E Neko and Flashback (欧拉路径 邻接表实现(当前弧优化..))

    就是一欧拉路径 贴出邻接表欧拉路径 CODE #include <bits/stdc++.h> using namespace std; const int MAXN = 100005; ...

  8. Codeforces Round #554 (Div. 2) F2. Neko Rules the Catniverse (Large Version) (矩阵快速幂 状压DP)

    题意 有nnn个点,每个点只能走到编号在[1,min(n+m,1)][1,min(n+m,1)][1,min(n+m,1)]范围内的点.求路径长度恰好为kkk的简单路径(一个点最多走一次)数. 1≤n ...

  9. Codeforce Round #554 Div.2 C - Neko does Maths

    数论 gcd 看到这个题其实知道应该是和(a+k)(b+k)/gcd(a+k,b+k)有关,但是之后推了半天,思路全无. 然而..有一个引理: gcd(a, b) = gcd(a, b - a) = ...

随机推荐

  1. Web后端 JAVA学习之路

    1.Java分类 Java按应用来分,可以分为J2ME(手机版),J2SE(标准版),J2EE(企业版)三部分. ・J2ME:已经被安卓开发取代. ・J2SE:Java的核心类,其中包括桌面应用,但一 ...

  2. informix存储过程笔记

    一.存储过程概述 存储过程是一个用户定义的函数,由存储过程语句(SPL) 和一组SQL语句组成,以可以执行代码形式存储在数据库中,和表.视图.索引等一样,是数据库的一种对象. 存储过程语言SPL(St ...

  3. 五一出门必备的手机APP神器 让你瞬间大开眼界

    如今我们手机上有各种各样的软件,但是比较实用的又有哪些呢?所以每次大家都会花上很久的时间去查找满意的软件吧!今天就给大家送上一波福利,因为五一小长假就要到来了,说不定大家会使用到呢! 轻颜相机 轻颜相 ...

  4. 360浏览器兼容模式下IE内核版本

    问题 最近在跟客户演示系统时,自己电脑IE 11下好好的,我们web系统最低支持到IE9.在客户电脑上,IE9浏览器下可以正常浏览,但是360兼容模式下,页面什么也不显示. 通过F12调试工具发现,3 ...

  5. Play vue.js with constant value in SailsJS

    SailsJS supplies a utility module called parasails, which defines two elements, <ajax-form> an ...

  6. TSC条码打印机C#例程(tsclib.dll调用) 【转】

    //----  program.cs using System;using System.Collections.Generic;using System.Windows.Forms; using S ...

  7. SSH服务与tcp wrappers实验

    SSH服务与tcp wrappers实验 实验环境: 一台linux(ssh client) 一台linux(ssh server) 实验步骤: 1.配置IP,测试连通性 2.在客户端创建用户yuzl ...

  8. py文件2种执行方式

    import m1# print('模块导入执行', m1.num) # import sys# print(sys.path)import json# print(json) if __name__ ...

  9. 第一次java作业

    学习了c语言半个学期,好像刚开始并不担心Java,因为Java也是类同于C语言的一种语言,可是Java学到现在也将近一个月,在我脑子里现在却还没有一个框架,有点着急了.

  10. zcu102 hdmi example(一)

    1,概述 有一个计划是打算做一个摄像头的驱动与显示. 但是实际上手上只有一个zcu102开发板,没有摄像头,也没有上位机,自己也不会写.所以就将方案阉割成将录制好的视频放在SD卡里面,然后从SD卡里面 ...