『扩欧简单运用』


扩展欧几里得算法

顾名思义,扩欧就是扩展欧几里得算法,那么我们先来简单地回顾一下这个经典数论算法。

对于形如\(ax+by=c\)的不定方程,扩展欧几里得算法可以在\(O(5log_{10}\min\{a,b\})\)的时间内找到该方程的一组特解,或辅助\(gcd\)判断该方程无解。

对于扩欧的详细讲解,可见『扩展欧几里得算法 Extended Euclid』

那么我们注意到一个问题,扩展欧几里得算法求的只是一组特解。事实上,我们可以根据如下公式得到不定方程的通解:
\[
\begin{cases}
x=x_0+k\frac{b}{gcd(a,b)}
\\y=y_0+k\frac{a}{gcd(a,b)}
\end{cases}
\]

其中,\(x_0,y_0\)是方程的一组特解,\(k\in Z\)。

关于正确性,其实代入就能发现多余项可以直接抵消,与此同时,我们发现与\(a,b\)分别相乘的额外项构成了\(lcm(a,b)\),这就能保证所有解都能由这个式子表示。

实际运用的时候,我们通常这样得到最小正整数解:\(x=(x_0\%\frac{b}{gcd(a,b)}+\frac{b}{gcd(a,b)})\%\frac{b}{gcd(a,b)}\)。

青蛙的约会

Description

两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝着对方那里跳,直到碰面为止。

可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面。

我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。

Input Format

一行5个整数x,y,m,n,L,其中x≠y,m、n≠0,L>0。m,n的符号表示了相应的青蛙的前进方向。

Output Format

在单独一行里输出碰面所需要的跳跃次数,如果永远不可能碰面则输出一行“Impossible”。

Sample Input

1 2 3 4 5 

Sample Output

4

解析

这是一道比较模板的题。我们设两只青蛙走了\(t\)步,它们追了\(k\)圈,那么就可以得到
\[
x+mt=y+nt+kl
\\?(n-m)t+kl=x-y
\]
那么这就是扩欧方程的形式了,直接利用扩展欧几里得求出一个解\(t_0\),然后利用上述通解公式得到最小整数解即可。

\(Code:\)

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
#define mset(name,val) memset(name,val,sizeof name)
#define mcopy(to,from) memcpy(to,from,sizeof from)
#define filein(str) freopen(str".in","r",stdin)
#define fileout(str) freopen(str".out","w",stdout)
inline long long Exeuclid(long long a,long long &x,long long b,long long &y,long long c)
{
    if (b==0){x=c/a,y=0;return a;}
    else
    {
        long long p=Exeuclid(b,x,a%b,y,c);
        long long x_=x,y_=y;
        x=y_ , y=x_-a/b*y_;
        return p;
    }
}
inline long long gcd(long long a,long long b)
{
    return b ? gcd(b,a%b) : a ;
}
long long x,y,n,m,l,x_,y_;
inline void input(void)
{
    scanf("%lld%lld%lld%lld%lld",&x,&y,&n,&m,&l);
}
inline long long solve(void)
{
    long long d=gcd(m-n,l);
    if ( (x-y) % d )return -1;
    Exeuclid(m-n,x_,l,y_,x-y);
    long long res = ( x_ % (l/d) + (l/d) ) % (l/d);
    return res;
}
int main(void)
{
    input();
    long long ans=solve();
    if (ans==-1)printf("Impossible\n");
    else printf("%lld\n",ans);
    return 0;
}


『扩欧简单运用』

原文地址:https://www.cnblogs.com/Parsnip/p/10696684.html

时间: 2024-07-31 14:26:50

『扩欧简单运用』的相关文章

NHibernate框架与BLL+DAL+Model+Controller+UI 多层架构十分相似--『Spring.NET+NHibernate+泛型』概述、知识准备及介绍(一)

原文://http://blog.csdn.net/wb09100310/article/details/47271555 1. 概述 搭建了Spring.NET+NHibernate的一个数据查询系统.之前没用过这两个框架,也算是先学现买,在做完设计之 后花了一周搭建成功了.其中,还加上了我的一些改进思想,把DAO和BLL之中相似且常用的增删改查通过泛型T抽象到了DAO和BLL的父类中,其DAO 和BLL子类只需继承父类就拥有了这些方法.和之前的一个数据库表(视图)对应一个实体,一个实体对应一

老秦『十里桃花招商』Q849852

老秦『十里桃花招商』Q849852 十里桃花招商老秦是一个信誉至上的上级,对下级更是无私的教导 十里桃花招商老秦秉持著赚钱一起赚的心态! 十里桃花招商老秦把下级当做是兄弟.是亲人.更是最重要的工作伙伴! 十里桃花招商老秦在市场已经混了六年,信誉更是无庸置疑! 十里桃花招商老秦团队目前已有二十馀人,团队还在持续扩大中! 十里桃花招商老秦诚邀您一起加入我们! 跟著十里桃花招商老秦,即时知道市场动态!

『浅入浅出』MySQL 和 InnoDB

作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 MySQL 的官方文档,希望对各位了解数据库的.不了解数据库的有所帮助. 本文中对于数据库的介绍以及研究都是在 MySQL 上进行的,如果涉及到了其他数据库的内容或者实现会在文中单独指出. 数据库的定义 很多开发者在最开始时其实都对数据

『浅入深出』MySQL 中事务的实现

在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的:在这篇文章中,我们将对事务的实现进行分析,尝试理解数据库是如何实现事务的,当然我们也会在文章中简单对 MySQL 中对 ACID 的实现进行简单的介绍. 事务其实就是并发控制的基本单位:相信我们都知道,事务是一个序列操作,其中的操作要么都执行,要么都不执行,它是一个不可分割的工作单位:数据库事务的 ACID 四大特性是事务的基础,了解了 AC

重新学习MySQL数据库2:『浅入浅出』MySQL 和 InnoDB

重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 MySQL 的官方文档,希望对各位了解数据库的.不了解数据库的有所帮助. 本文中对于数据库的介绍以及研究都是在 MySQL 上进行的,如果涉及到了其他数据库的内容或者

『概率和数学期望』

概率 基础概念 定义 设样本空间为\(\Omega\),若对于\(\Omega\)中的每一个随机事件\(A\),都存在实值函数\(P(A)\),满足: \(1.\) \(P(A)\geq0\) \(2.\) \(P(\Omega)=1\) \(3.\) 对于若干个两两互斥事件\(A_1,A_2,...,A_n\),有\(\sum_{i=1}^n P(A_i)=P(\bigcup_{i=1}^n A_i)\) 则称\(P(A)\)为随机事件\(A\)发生的概率. 必然事件 一定发生的事件称为必然事

『后缀自动机入门 SuffixAutomaton』

本文的图片材料多数来自\(\mathrm{hihocoder}\)中详尽的\(SAM\)介绍,文字总结为原创内容. 确定性有限状态自动机 DFA 首先我们要定义确定性有限状态自动机\(\mathrm{DFA}\),一个有限状态自动机可以用一个五元组\((\mathrm{S},\Sigma,\mathrm{st},\mathrm{end},\delta)\)表示,他们的含义如下: \(1.\) \(\mathrm{S}\) 代表自动机的状态集 \(2.\) \(\Sigma\) 代表字符集,也称字

Codeforces Round #305 (Div. 2)C---Mike and Frog(扩欧+乱搞)

Mike has a frog and a flower. His frog is named Xaniar and his flower is named Abol. Initially(at time 0), height of Xaniar is h1 and height of Abol is h2. Each second, Mike waters Abol and Xaniar. So, if height of Xaniar is h1 and height of Abol is

扩展欧几里德算法.....哦,扩欧

首先推荐两篇比较好的博客 http://blog.csdn.net/lincifer/article/details/49391175 (然后下面便是一个蒟蒻的总结QAQ) 扩展欧几里德算法 基本算法: 对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 ax + by = gcd(a, b) = d. 证明: 设 a > b. 1. 显然当 b = 0,gcd (a,b) = a 时, x = 1,y = 0: 2. ab != 0