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 ...
随机推荐
- Java 程序员们值得一看的好书推荐[转载]
“学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超其他 ...
- sring mvc 返回值至jsp界面的几种方式
Spring 通过Controller 向 View 传值的方法有以下四种 HttpServletRequest ModelAndView Map<String, Object> map ...
- POJ3635 Full Tank?(DP + Dijkstra)
题目大概说,一辆带有一个容量有限的油箱的车子在一张图上行驶,每行驶一单位长度消耗一单位油,图上的每个点都可以加油,不过都有各自的单位费用,问从起点驾驶到终点的最少花费是多少? 这题自然想到图上DP,通 ...
- HDU5461 Largest Point(暴力)
这题第一眼就想到暴力.. 枚举每一个ti,就能确定tj,tj一定是剩下数最大或最小的.为了求tj就要求出数列最大最小次大次小.时间复杂度O(n). 感觉暴力挺有趣的. #include<cstd ...
- WPF – pass multiple parameters to a Command
public class SendCommand : ICommand { public void Execute(object parameter) { var labels = ((object[ ...
- BZOJ3092 : [FDU2012校赛] A Famous King’s Trip
题目等价于去掉两条边,使得剩下的图连通,且所有点度数都为偶数. 首先特判掉图一开始就不连通的情况. 求出dfs生成树,对于每条非树边随机一个权值,每条树边的权值为所有经过它的非树边权值的异或和. 那么 ...
- BZOJ3514 : Codechef MARCH14 GERALD07加强版
以边编号为权值 用Link-cut Tree维护最大生成树 对于新加的第i条边(u,v) a[i]表示当a[i]这条边加入后连通块个数会减少 若u==v则a[i]=m 若u与v不连通则连上,a[i]= ...
- [linux]ubuntu 下安装RMySQL包
http://downloads.mysql.com/docs/connector-odbc-en.pdf http://blog.csdn.net/ixidof/article/details/59 ...
- hibernate.cfg.xml配置文件和hbm.xml配置文件
http://blog.sina.com.cn/s/blog_a7b8ab2801014m0e.html hibernate.cfg.xml配置文件格式 <?xml version=" ...
- Linux远程传输命令之scp使用方法
首先用pwd命令确定文件全路径 1.获取远程服务器上的文件 cykdeMacBook-Pro:~ cyk$ scp cyk@10.211.55.5:/home/cyk/Desktop/hi.t ...