POJ 1061:青蛙的约会
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 95878 | Accepted: 17878 |
Description
我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。
Input
Output
Sample Input
1 2 3 4 5
Sample Output
4
题意就是解一个方程,即(x+m*t)-(y+n*t)=p*L。求满足方程的最小t。将方程变换为(n-m)*t+p*L=x-y。这个方程里面x,y,n,m都已知。
一开始不知道扩展欧几里得的方法,就一直遍历判断看能不能有符合条件的数值,提交了44次还是TLE。。。
(摘自百度百科)扩展欧几里德:
扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式: ax+by = gcd(a,
b) =d(解一定存在,根据数论中的相关定理)。
欧几里德算法
概述
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:gcd函数就是用来求(a,b)的最大公约数的。gcd函数的基本性质:gcd(a,b)=gcd(b,a)=gcd(-a,b)=gcd(|a|,|b|)
公式表述
gcd(a,b)=gcd(b,a mod b)
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有d|a,
d|b,而r = a - kb,因此d|r。因此d是(b,a mod b)的公约数。
假设d 是(b,a mod b)的公约数,则d
| b , d |r ,但是a = kb +r,因此d也是(a,b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
C++语言实现
<span style="font-size:12px;">#include<iostream>
#include<cstdio>
using namespace std;
int x,y,q;
void extend_Eulid(int a,int b){
if(b==0){
x=1;y=0;q=a;
return;
}
extend_Eulid(b,a%b);
int temp=x;
x=y;
y=temp-a/b*y;
}
int main(){
int a,b;
cin>>a>>b;
extend_Eulid(a,b);
printf("%d=(%d)*%d+(%d)*%d\n",q,x,a,y,b);
return 0;
}</span>
扩展算法
对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对
x,y ,使得 gcd(a,b)=ax+by。
c++语言实现
<pre name="code" class="html">int exgcd(ll a,ll b,ll &x,ll &y)
{
if(a==0)
{
x=0;y=1;
return b;
}
else
{
ll tx,ty;
ll d=exgcd(b%a,a,tx,ty);
x=ty-(b/a)*tx;
y=tx;
return d;
}
}
代码:
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std; long long d; void ex_gcd(long long a,long long b,long long &xx,long long &yy)
{
if(b==0)
{
xx=1;
yy=0;
d=a;//d为求出来的a,b的最小公约数
}
else
{
ex_gcd(b,a%b,xx,yy); long long t=xx;
xx=yy;
yy=t-(a/b)*yy;
}
} int main()
{
long long x,y,m,n,L,xx,yy;
cin>>x>>y>>m>>n>>L; ex_gcd(n-m,L,xx,yy); if((x-y)%d)//如果方程等式右边不能除以最小公约数,说明该方程没有解。
{
cout<<"Impossible"<<endl;
}
else
{
xx=xx*((x-y)/d);//求出的xx,yy是方程等于最小公约数时的解,这时要将解扩大为(x-y)*d倍。
long long r=L/d;
xx=(xx%r+r)%r;//此处求解的最小值
cout<<xx<<endl;
}
system("pause");
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 1061:青蛙的约会的更多相关文章
- poj 1061 青蛙的约会 拓展欧几里得模板
// poj 1061 青蛙的约会 拓展欧几里得模板 // 注意进行exgcd时,保证a,b是正数,最后的答案如果是负数,要加上一个膜 #include <cstdio> #include ...
- ACM: POJ 1061 青蛙的约会 -数论专题-扩展欧几里德
POJ 1061 青蛙的约会 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%lld & %llu Descr ...
- POJ.1061 青蛙的约会 (拓展欧几里得)
POJ.1061 青蛙的约会 (拓展欧几里得) 题意分析 我们设两只小青蛙每只都跳了X次,由于他们相遇,可以得出他们同余,则有: 代码总览 #include <iostream> #inc ...
- poj 1061 青蛙的约会 (扩展欧几里得模板)
青蛙的约会 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status ...
- POJ 1061青蛙的约会(拓展欧几里德算法)
题目链接: 传送门 青蛙的约会 Time Limit: 1000MS Memory Limit: 65536K Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见 ...
- POJ 1061 青蛙的约会
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 82859 A ...
- poj 1061青蛙的约会
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 90083 Accepted: 16257 Descripti ...
- POJ 1061 青蛙的约会 扩展欧几里德--解不定方程
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 81606 Accepted: 14116 Descripti ...
- POJ 1061 青蛙的约会(拓展欧几里得求同余方程,解ax+by=c)
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 122871 Accepted: 26147 Descript ...
- poj 1061 青蛙的约会 扩展欧几里德
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Description 两 只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们 ...
随机推荐
- 解题报告:luogu P5745 【深基附B例】数列求和
题目链接:P5745 [深基附B例]数列求和 现在想说:\(O(N)\)的题要不怎么也想不出来,要不灵光乍现,就像这道题. 我们维护一个类似单调队列的加法单调队列: 若相加大于此数,就将队尾元素弹出, ...
- 38 java 使用标签跳出多层嵌套循环
public class Interview { public static void main(String[] args) { //使用带标签的break跳出多层嵌套循环 Boolean flag ...
- 「POI2011」Meteors
「POI2011」Meteors 传送门 整体二分,树状数组实现区间修改单点查询,然后注意修改是在环上的. 参考代码: #include <cstdio> #include <vec ...
- [Linux] day05——命令行
--------------------linux命令 实现某一功能指令或程序 命令行执行依赖于解释器linux命令的分类 内部命令 属于shell解释器一部分 /bin/bash 外部命令 独立与s ...
- Django:验证email或者name是否已被注册
灵感: http://blog.csdn.net/xxm524/article/details/48369623 使用表单的dajngo的clean()方法实现
- scrcpy投屏android手机到电脑
在mac os下 投票iPhone投屏是最简单不过了,只需要用Quicktime player就可以. 但是在mac下咱投屏android的手机呢,就需要用到scrcpy了. 1.打开终端,输入命令: ...
- Django 连接 Mysql (8.0.16) 失败
首先,确认数据库配置正确无误: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # or use: mysql.con ...
- 网络流之最大流(详解 附《算法导论》上证明 及P4843 清扫雪道)
由于此篇笔记写于本地,篇幅较大,导出困难,所以将其转换为了图片,方便阅读.
- 「CF5E」Bindian Signalizing
传送门 Luogu 解题思路 很显然的一点,任何一条可能成为路径的圆弧都不可能经过最高的点,除非这条路径全是最高点. 所以我们先把最大值抠掉,把剩下的按原来的顺序排好. 从前往后.从后往前扫两次,用单 ...
- Java安全中的“大坑”,跨平台真“浮云”
Java安全HttpDB 最近在做一个开源项目HttpDB,它的目标是在互联网中通过JDBC安全的查询数据库,解决云计算报表的数据库访问问题. 数据传输使用AES加密算法,用到了Java提供的安全库j ...