CodeForces-1152C Neko does Maths(GCD)

题目传送门:CodeForces-1152C Neko does Maths

题目大意:

给你两个值a,b,让你求出使lcm(a+k,b+k),最小的k值

gcd性质:

gcd性质:gcd(a,a) = gcd(a,a)      gcd(a,b) = gcd(a,a-b)(a>b)      gcd(a,b) = gcd(b,a-b)(a>b)证明:设gcd(a,b)=z;     a=zx ,b=zy ,a-b=z(x-y)    要证明a-b和b的gcd等于a和b的gcd    b=zy a-b=z(x-y) 则需要证明y和x-y互质即可,这样他们gcd同为z

    x和y显然为质数,存在两种情况       x和y其中不存在2:设x=2m-1 y=2n-1,则x-y=2(m-n)为一个偶数,显然x-y和质数y互质    x和y其中存在2:设x=2m+1 y=2 ,则x-y=2m-1 显然x-y和2互质。    成立。

分析:

lcm(a+k,b+k) = (a+k)*(b+k) / gcd(a+k,b+k). 要使得lcm(a+k,b+k)最小,则需要gcd(a+k,b+k)最大
设gcd(a+k,b+k) = z.
则存在 (a+k)%z = (b+k)%z = 0;
    a%z = b%z
      (a - b) % z = 0
所以 a+k 和 b+k 的最大公约数z,是(a-b)的约数
因为gcd(a+k,b+k)=gcd(a+k,a-b)

因此可以枚举(a-b)的因子,将a+k凑至存在该因子,则k =(x-a%x)(x为因子),进行判断lcm即可。

代码:

#include<iostream>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
    return b==0?a:gcd(b,a%b);
}
ll lcm(ll a,ll b){
    return a*b/gcd(a,b);
}
ll a,b,mmax,ans=0;
void solve(int x)
{
    int temp=x-a%x;            //将a凑至存在因子x
    if(lcm(a+temp,b+temp)<mmax){
        ans=temp;
        mmax=lcm(temp+a,b+temp);
    }
}
int main(){
    cin>>a>>b;
    if(a<b)swap(a,b);

    int c=a-b;
    mmax=lcm(a,b);
    for(int i=1;i*i<=c;i++){    //枚举a-b的因子
        if(c%i==0){
            solve(i);
            solve(c/i);
        }
    }
    cout<<ans<<endl;
    return 0;
}

参考:https://www.cnblogs.com/dancewithautomation/archive/2012/06/23/2559451.html

原文地址:https://www.cnblogs.com/LjwCarrot/p/10778130.html

时间: 2024-08-30 17:36:38

CodeForces-1152C Neko does Maths(GCD)的相关文章

codeforce 1152C. Neko does Maths(欧几里得算法)

找到一个k使得a+k与b+k的最大公倍数lcm最小 欧几里得算法:gcd(a,b) = gcd(b,a mod b). gcd是b-a的除数. 让我们迭代b-a的所有除数q. 这也意味着a(modq)= b(modq). 如果a(modq)= 0,我们可以使用k = 0. 否则,相应的k应为q-a(modq). 最后,我们需要检查lcm(a + k,b + k)的值是否是迄今为止找到的最小值. #include <bits/stdc++.h> using namespace std; type

Codeforces Round #554 (Div. 2) 1152C. Neko does Maths

学了这么久,来打一次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说不定有点关系 然后就没有然后了 比赛的时候交了一发暴力上去,然并软 赛后补题,题解里面

[编写高质量iOS代码的52个有效方法](十)Grand Central Dispatch(GCD)

[编写高质量iOS代码的52个有效方法](十)Grand Central Dispatch(GCD) 参考书籍:<Effective Objective-C 2.0> [英] Matt Galloway 先睹为快 41.多用派发队列,少用同步锁 42.多用GCD,少用performSelector系列方法 43.掌握GCD及操作队列的使用时机 44.通过Dispatch Group机制,根据系统资源状况来执行任务 45.使用dispatch_once来执行只需要运行一次的线程安全代码 46.不

Codeforces Round #259 (Div. 2) (序列)

题目链接:http://codeforces.com/contest/454/problem/B B. Little Pony and Sort by Shift time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output One day, Twilight Sparkle is interested in how to sort a se

IOS学习之十七:Grand Central Dispatch(GCD)编程基础

IOS学习之十七:Grand Central Dispatch(GCD)编程基础 有过编程经验的人,基本都会接触到多线程这块. 在java中以及Android开发中,大量的后台运行,异步消息队列,基本都是运用了多线程来实现. 同样在,在ios移动开发和Android基本是很类似的一种模型. 但是很多时候,在应用开发中,我们会发现本身并没有自己编码去处理一些并发的事件,去开辟新的子线程等等. (虽然一般的调用sdk发起一个网络请求,系统都是会默认给你新起一个线程去处理的). 整个程序看上去基本就是

笔试算法题(34):从数字序列中寻找仅出现一次的数字 &amp; 最大公约数(GCD)问题

出题:给定一个数字序列,其中每个数字最多出现两次,只有一个数字仅出现了一次,如何快速找出其中仅出现了一次的数字: 分析: 由于知道一个数字异或操作它本身(X^X=0)都为0,而任何数字异或操作0都为它本身,所以当所有的数字序列都异或操作之后,所有出现两次的数字异或操作之后的结果都为0,则最后剩下的结果就是那个仅出现了一次的数字: 如果有多个数字都仅仅出现了一次,则上述的异或操作方法不再适用:如果确定只有两个数字只出现了一次,则可以利用X+Y=a和XY=b求解: 解题: 1 int findSin

Swift - 多线程实现方式 - Grand Central Dispatch(GCD)

1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术:(1)Thread(2)Cocoa Operation(Operation和OperationQueue)(3)Grand Central Dispath(GCD) 2,本文着重介绍Grand Central Dispath(GCD) GCD是Apple开发的一个多核编程的解决方法,基本概念就是dispatch queue(调度队列),queue是一个对象,它可以接受任务,并将任务以先到先执行的顺序来执行.dispat

HDU 1695(GCD)

GCD Time Limit: 3000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u [Submit]   [Go Back]   [Status] Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common

Grand Central Dispatch(GCD)

一.Grand Central Dispatch(GCD)概要 1.什么是GCD Grand Central Dispatch(GCD)是异步执行任务的技术之一. GCD用我们难以置信的非常简洁的记述方法,实现了极为复杂繁琐的多线程编程. 例如: dispatch_async(queue, ^{ //长时间处理 //例如AR用动画识别 //例如数据库访问 //长时间处理结束,主线程使用该处理结果 dispatch_async( dispatch_get_main_queue(), ^{ //只在