Codeforces Round #554 (Div. 2) C. Neko does Maths(数学+GCD)
•题意
给出两个正整数 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)的更多相关文章
- Codeforces Round #554 (Div. 2) C. Neko does Maths (简单推导)
题目:http://codeforces.com/contest/1152/problem/C 题意:给你a,b, 你可以找任意一个k 算出a+k,b+k的最小公倍数,让最小公倍数尽量小,求出 ...
- 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 ...
- 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: •思路 时隔很久,又重新做这个题 温故果然可以知新❤ ...
- Codeforces Round #554 (Div. 2) 1152B. Neko Performs Cat Furrier Transform
学了这么久,来打一次CF看看自己学的怎么样吧 too young too simple 1152B. Neko Performs Cat Furrier Transform 题目链接:"ht ...
- Codeforces Round #554 (Div. 2) 1152A - Neko Finds Grapes
学了这么久,来打一次CF看看自己学的怎么样吧 too young too simple 1152A - Neko Finds Grapes 题目链接:"https://codeforces. ...
- Codeforces Round #554 (Div. 2) B. Neko Performs Cat Furrier Transform(思维题+log2求解二进制位数的小技巧)
传送门 题意: 给出一个数x,有两个操作: ①:x ^= 2k-1; ②:x++; 每次操作都是从①开始,紧接着是② ①②操作循环进行,问经过多少步操作后,x可以变为2p-1的格式? 最多操作40次, ...
- Codeforces Round #554 (Div. 2) E Neko and Flashback (欧拉路径 邻接表实现(当前弧优化..))
就是一欧拉路径 贴出邻接表欧拉路径 CODE #include <bits/stdc++.h> using namespace std; const int MAXN = 100005; ...
- 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 ...
- 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) = ...
随机推荐
- SAP MM 采购ERP顾问咨询费限制总金额的框架协议实现方案
SAP MM 采购ERP顾问咨询费限制总金额的框架协议实现方案 [业务场景] 采购部门与ERP咨询公司签订了一个框架协议,只规定不同级别顾问的人天费用,不限定这些不同级别咨询顾问的具体采购的人天数,但 ...
- java 设计模式 ---- 工场模式
官方描述: 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类 土话描述: 先把所有的情况设先计出来, 后面根据条件实现哪种情况 比如我想找女朋友, 喜欢的类型可能是: 屁股大的, 胸挺的, ...
- 【设计模式】桥接模式 Bridge Pattern
开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...
- Python数据描述与分析
在进行数据分析之前,我们需要做的事情是对数据有初步的了解,比如对数据本身的敏感程度,通俗来说就是对数据的分布有大概的理解,此时我们需要工具进行数据的描述,观测数据的形状等:而后才是对数据进行建模分析, ...
- Vue components Cannot read property '__ob__' of undefined
在Vue开发过程中,子组件向父组件传值的过程中,函数时可以对应的触发的,但是当父组件要改变自己的属性的时候报错了. 具体的页面逻辑是这样的,父组件 子组件 点击了之后没有问题,子组件向父组件传值 t ...
- HTTP中GET和POST的区别主要是那些,面试中可以加分的该说那些?
面试回答: GET请求在URL中传送的参数是有长度限制的,而POST没有. GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息. GET参数通过URL传递,POST放在Re ...
- Python之Pandas的一些理解
Pandas的功能: 1. 结构化的数据分析; 相比excel,可以处理更大量的数据和更好的性能 2. 对数据的清洗
- SQLSTATE[HY000]: General error: 1030 Got error 28 from storage engine
今天上课程化平台考试,输入平台网址突然报这个错误 可以先df -h 发现/tmp文件使用满了 ,清理下不需要的临时文件即可
- LeetCode算法题-Flood Fill(Java实现)
这是悦乐书的第306次更新,第325篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是733).图像由二维整数数组表示,每个整数表示图像的像素值(从0到 ...
- ztree搜索节点并展开
web <div class="zTreeC"> <div class="searchL" lay-filter="searchL& ...


