poj1061-青蛙的约会(扩展欧几里德算法)
一,题意:
两个青蛙在赤道上跳跃,走环路。起始位置分别为x,y。
每次跳跃距离分别为m,n。赤道长度为L。两青蛙跳跃方向与次数相同的情况下,
问两青蛙是否有方法跳跃到同一点。输出最少跳跃次数。
二,思路:
本题用到扩展欧几里德算法求二元一次不定式方程(ax+by=c)。
1,化简方程,然后求解 ax+by = gcd(a,b);
2,求解 ax+by = c;
3,求出最小非负整数解x1
三,步骤:
1,设青蛙跳了s步。
则有方程 (x + m*s) - (y + n*s) = l*k --> (n - m)*s + l*k = x - y
令 a = n - m , b = l , x' = s , y' = k , c = x - y ; d = gcd(a,b);
所以方程化为 a*x' + b*y' = c ;
2,先利用扩展欧几里德算法求解方程 a*x' + b*y' = gcd(a,b);
3,利用方程 a*x' + b*y' = gcd(a,b) 的解 x0 以及公式 x = x0*c/d 求出 a*x' + b*y' = c 的解 x1 ; 前提是:d|c ( c 能被 d 整除 );
4,利用周期性变化求最小的非负整数解 公式: x1 = ( x1%(b/d) + (b/d) ) % (b/d);
若方程的a*x' + b*y' = c的一组整数解为(x1,y1),则它的任意整数解为 ( x1 + k* ( b/d ) , y1 - k*( a/d ) ) ( k 取任意整数 ) , T = b/d 就为 x1 增长的周期
i,若x1为负值,取最大的非正值:x1 = x1 % T ;若x1为正值,以下两步无影响。
ii,取正, x1 = x1 + T ;
iii, 防止 i中的x1=0 即 ii中的x1 = T ,那么 x1 = x1 % T ;
#include<iostream>
using namespace std ; //扩展欧几里德算法 : 用来求解 a*x+b*y=gcd(a,b) 方程x,y可能的值
void exgcd(long long a,long long b,long long& d,long long& x,long long& y){ //int& a 表示传入a的地址
if(!b){d=a;x=;y=;} // d用来存储gcd(a,b)的值
else {exgcd(b,a%b,d,y,x);y-=x*(a/b);}
} int main(){
long long minx,x,y,m,n,l,d,x1,y1,T;
cin>>x>>y>>m>>n>>l;
exgcd(n-m,l,d,x1,y1); //(n-m)*s+l*k = gcd(n-m,l) ==> x1=s y1=k;
if((x-y)%d!=) cout<<"Impossible\n"; //方程有解的条件是:x-y 能被 gcd(n-m,l) 整除
else{
x1=x1*((x-y)/d); //思路2中方程 a*x1 + b*y1 = c 的解 x1 ;
T=l/d; //x的增长周期 T
x1=(x1%T+T)%T;//求出最小非负整数解
cout<<x1<<endl;
}
return ;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
poj1061-青蛙的约会(扩展欧几里德算法)的更多相关文章
- POJ1061青蛙的约会(扩展欧几里德算法)
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 102239 Accepted: 19781 Descript ...
- poj1061 青蛙的约会 扩展欧几里德的应用
这个题解得改一下,开始接触数论,这道题目一开始是看了别人的思路做的,后来我又继续以这种方法去做题,发现很困难,学长告诉我先看书,把各种词的定义看懂了,再好好学习,我做了几道朴素的欧几里德,尽管是小学生 ...
- POJ-1061青蛙的约会,扩展欧几里德求逆元!
青蛙的约会 以前不止一次看过这个题,但都没有去补..好吧,现在慢慢来做. 友情提示 ...
- POJ1061——青蛙的约会(扩展欧几里德)
青蛙的约会 Description两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件 ...
- poj1061青蛙的约会 (扩展欧几里德)
Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事 ...
- POJ1061 青蛙的约会 —— 扩展gcd
题目链接:https://vjudge.net/problem/POJ-1061 青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submi ...
- 解题报告:poj1061 青蛙的约会 - 扩展欧几里得算法
青蛙的约会 writer:pprp Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 119716 Accepted: 25238 ...
- POJ1061-青蛙的约会---扩展欧几里德算法求最小整数解
扩展欧几里得算法模板 #include <cstdio> #include <cstring> #define ll long long using namespace std ...
- BZOJ1477 青蛙的约会 扩展欧几里德
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1477 题意概括 两只青蛙,现在分别在x,y的位置,以m,n的速度在周长为L的环形跑道上面跑. 问他 ...
- POJ1061青蛙的约会[扩展欧几里得]
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 108911 Accepted: 21866 Descript ...
随机推荐
- Codeforces Round #356 (Div. 2)-B
B. Bear and Finding Criminals 链接:http://codeforces.com/contest/680/problem/B There are n cities in B ...
- hdu 5269 ZYB loves Xor I
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission( ...
- 启动windows的服务--《用delphi开发共享软件》-15.2桌面提示器
在dos 下用命令启动一个服务:NET START "Windows Desktop Reminder" 一下为用delphi启动服务: Function RunProcess(s ...
- http://www.cnblogs.com/baizhanshi/p/5593431.html
http://www.cnblogs.com/baizhanshi/p/5593431.html
- Python学习笔记04
语句之后有冒号,表示有一个语句块,且以四个空格的缩进来表示隶属关系. 与C# 相比,没有了{},没有了(),被冒号和缩进取代了 if,while,for,range,continue,break if ...
- iOS学习14之OC NSNumber + NSValue
1.NSNumber 数值类. 作用:实现基本数据类型与OC对象类型的相互转化. 1> NSNumber创建对象 // 初始化方法 NSNumber *num1 = [[NSNumber all ...
- POJ 2096 (概率DP)
题目链接: http://poj.org/problem?id=2096 题目大意:n种bug,s个子系统.每天随机找一个bug,种类随机,来自系统随机.问找齐n种bug,且每个子系统至少有一个bug ...
- ACM 红黑树
红黑树 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 什么是红黑树呢?顾名思义,跟枣树类似,红黑树是一种叶子是黑色果子是红色的树... 当然,这个是我说的... & ...
- ACM Same binary weight
Same binary weight 时间限制:300 ms | 内存限制:65535 KB 难度:3 描述 The binary weight of a positive integer ...
- iOS单例的作用和使用
单例 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 一是某个类只能有一个实例:二是它必须自行创建这个实例:三是它必须自行 ...