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 ...
随机推荐
- 2016.8.16 HTML5重要标签及其属性学习
1.运用BootStrap的基本布局: 2.基本布局第二步: ] 3.BootStrap提供了一个class=”well“”类,可以给你种深度的感觉: 4.不是每一个类都是为了CSS,有些类创建出来只 ...
- no-jquery 01Elements
Select Elements id // IE 5.5+ document.getElementById('myElement'); // IE 8+ document.querySelector( ...
- python闭包与装饰器
转自小马哥: 闭包和装饰器充分体现了Python语法糖的优雅感觉. 在本文中,我们的实验要完成两个工作,一个是加法,一个是累计调用加法的次数,最普通的Python程序可以这么写: def valida ...
- Java List与数组之间的转换
http://blog.csdn.net/kingzone_2008/article/details/8444678
- OpenCV播放视频带滚动条(3)
演示 :一个带有滚动条的播放视频的代码. #include "stdafx.h" #include <opencv2/core/core.hpp> #inclu ...
- POJ3084 Panic Room(最小割)
把某点与某几点分开的最小花费,当然想到最小割.具体怎么建图,可以画个简单的情况,然后就清楚了: 0到1不受控制,建立0->1容量为INF的边: 1到0受在0一边的一个控制面板的控制,建立1-&g ...
- UIImage两种初始化的区别
UIImage可以通过以下两种方式进行初始化: //第一种初始化方式:[注意使用这种初始化的时候如果是png格式的可以不给后缀名,根据屏幕的的分辨率去匹配图片] UIImage *image = [U ...
- BZOJ4624 : 农场种植
设$A[i][j]=[a[i][j]=G],B[i][j]=[b[i][j]=L]$,枚举右下角,则对应$(A-B)^2$的和就是匹配成功的格子数. $(a-b)^2=a^2+b^2-2ab$,将矩阵 ...
- BZOJ4386 : [POI2015]Wycieczki
将每个点拆成三个点,并将转移转化为矩阵乘法,然后倍增即可求出第$k$短路的长度,注意对爆long long情况的处理. 时间复杂度$O(n^3\log k)$. #include<cstdio& ...
- 【BZOJ3631】松树的新家 树链剖分
BZOJ3631 松树的新家 Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...