/**
题目:青蛙的约会
链接:https://vjudge.net/contest/154246#problem/R
题意:一个跑道长为周长为L米,两只青蛙初始位置为x,y;(x!=y,同时逆时针运动,每一次运动分别为m,n米;问第几次运动后相遇,即在同一位置。
如果永远无法相遇输出Impossible。
思路:
设:次数为t;
圈总长为: L
A位置:(x+m*t)%L;
B位置: (y+n*t)%L; 如果: (x+m*t)%L = (y+n*t)%L 存在碰面; 暴力枚举t。太大了; 保证m,n<L; m%=L; n%=L; 又x!=y; => (x+m*t - (y+n*t)) %L = 0;
设:x+m*t-y-n*t = L*k; (k为整数); =>(x-y)+(m-n)*t = L*k; L*k-(m-n)*t = (x-y); 未知数(k, t); 换位置:(m-n)*t - L*k = (y-x) 令:ax+by = c; a = m-n;
b = -L;
c = y-x; 然后根据:
方程ax+by=c的整数解(a,b,c为整数)
令g=gcd(a,b), 很明显,c不是g的倍数时方程无解。如果c等于g,用扩展欧几里德算法求得一组解(x0,y0). 如果c是g的倍数,则相应的一组解(x0*c/g,y0*c/g).
若方程存在解(x1,y1),则通解形式为(x1+k*b/g, y1-k*a/g), k为任意整数 */ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+;
const double eps = 1e-;
ll gcd(ll a,ll b)
{
return b==?a:gcd(b,a%b);
}
ll ext_gcd(ll a,ll b,ll &x,ll &y)
{
ll ret, tmp;
if(!b){
x = , y = ; return a;
}
ret = ext_gcd(b,a%b,x,y);
tmp = x;
x = y;
y = tmp-a/b*y;
return ret;
}
int main()
{
ll x, y, m, n, L;
while(scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&L)!=EOF)
{
ll a, b, c;
a = m-n;
b = -L;
c = y-x;
if(c%gcd(a,b)!=){
printf("Impossible\n"); continue;
}
ll xx, yy;
ll d = ext_gcd(a,b,xx,yy);
ll add = b/d;
ll t = xx*c/d;
if(add<) add = -add;
t %= add;
if(t<=) t+=add;
printf("%lld\n",t);
}
return ;
} 下面这一份是自己最开始写的方法。很繁琐。

/**
题目:青蛙的约会
链接:https://vjudge.net/contest/154246#problem/R
题意:一个跑道长为周长为L米,两只青蛙初始位置为x,y;(x!=y,同时逆时针运动,每一次运动分别为m,n米;问第几次运动后相遇,即在同一位置。
如果永远无法相遇输出Impossible。
思路:
设:次数为t;
圈总长为: L
A位置:(x+m*t)%L;
B位置: (y+n*t)%L; 如果: (x+m*t)%L = (y+n*t)%L 存在碰面; 暴力枚举t。太大了; 保证m,n<L; m%=L; n%=L; 又x!=y; => (x+m*t - (y+n*t)) %L = 0;
设:x+m*t-y-n*t = L*k; (k为整数); =>(x-y)+(m-n)*t = L*k; L*k-(m-n)*t = (x-y); 未知数(k, t); 令:ax+by = c; a = L;
b = -(m-n);
c = (x-y); 为了保证c为正数,所以要处理一下符号关系。暂且当做已经处理过。 把负号都放入未知数中。那么要判断是否这样处理过,如果处理过,那么得出来的K,t要取反。 题目应该是求最小的满足的解t>=1; 然后根据:
方程ax+by=c的整数解(a,b,c为整数)
令g=gcd(a,b), 很明显,c不是g的倍数时方程无解。如果c等于g,用扩展欧几里德算法求得一组解(x0,y0). 如果c是g的倍数,则相应的一组解(x0*c/g,y0*c/g).
若方程存在解(x1,y1),则通解形式为(x1+k*b/g, y1-k*a/g), k为任意整数 */ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+;
const double eps = 1e-;
ll gcd(ll a,ll b)
{
return b==?a:gcd(b,a%b);
}
ll ext_gcd(ll a,ll b,ll &x,ll &y)
{
ll ret, tmp;
if(!b){
x = , y = ; return a;
}
ret = ext_gcd(b,a%b,x,y);
tmp = x;
x = y;
y = tmp-a/b*y;
return ret;
}
int main()
{
ll x, y, m, n, L;
while(scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&L)!=EOF)
{
int flag = ;///flag==0表示正数,否则表示负数;
ll a, b, c;
a = L;
b = m>n?(m-n):(n-m);
c = x>y?(x-y):(y-x);
if(m-n==){
printf("Impossible\n"); continue;
}
if(x>y){
if(m>n) flag = ;
}else
{
if(m<n) flag = ;
}
if(c%gcd(a,b)!=){
printf("Impossible\n"); continue;
}
ll xx, yy;
ll d = ext_gcd(a,b,xx,yy);
ll ans = inf;
ll add = -a/d;//<0
ll t = yy*c/d;
if(flag){///t应该为负数,取反才为正数。
if(t>=){
t %= (-add);
while(t>=){
t += add;
}
ans = -t;
}else
{
t = (-t)%(-add);
t = -t;
if(t==){
ans = -add;
}
while(t<){
ans = -t;
t -= add;
}
}
}else
{///t应该为正数。
if(t>){
t %= (-add);
while(t>){
ans = t;
t += add;
}
}else
{
t = (-t)%(-add);
t = -t;
while(t<=){
t -= add;
}
ans = t;
}
}
if(ans==inf){
printf("Impossible\n"); continue;
}else
printf("%lld\n",ans);
}
return ;
}

青蛙的约会 扩展欧几里得 方程ax+by=c的整数解 一个跑道长为周长为L米,两只青蛙初始位置为x,y;(x!=y,同时逆时针运动,每一次运动分别为m,n米;问第几次运动后相遇,即在同一位置。的更多相关文章

  1. pku 1061 青蛙的约会 扩展欧几里得

    青蛙的约会Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 120482 Accepted: 25449Description 两只青 ...

  2. poj 1061 青蛙的约会 (扩展欧几里得模板)

    青蛙的约会 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status ...

  3. JZYZOJ1371 青蛙的约会 扩展欧几里得 GTMD数论

    http://172.20.6.3/Problem_Show.asp?id=1371 题意是两个青蛙朝同一个方向跳 http://www.cnblogs.com/jackge/archive/2013 ...

  4. Poj 1061 青蛙的约会(扩展欧几里得解线性同余式)

    一.Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要 ...

  5. POJ - 1061 青蛙的约会 扩展欧几里得 + (贝祖公式)最小正整数解

    题意: 青蛙 A 和 青蛙 B ,在同一纬度按照相同方向跳跃相同步数,A的起点为X ,每一步距离为m,B的起点为Y,每一步距离为 n,一圈的长度为L,求最小跳跃步数. 思路: 一开始按照追击问题来写, ...

  6. [poj1061]青蛙的约会<扩展欧几里得>

    题目链接:http://poj.org/problem?id=1061 其实欧几里得我一直都知道,只是扩展欧几里得有点蒙,所以写了一道扩展欧几里得裸题. 欧几里得算法就是辗转相除法,求两个数的最大公约 ...

  7. POJ 1061 青蛙的约会 扩展欧几里得

    扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cs ...

  8. [P1516]青蛙的约会 (扩展欧几里得/中国剩余定理?)

    每日做智推~ 一看就是一道数学题. 再看是一道公约数的题目. 标签是中国孙子定理. 题解是扩展欧几里得 (笑) 一开始没看数据范围 只有50分 开一个longlong就可以了 #include< ...

  9. POJ1061青蛙的约会[扩展欧几里得]

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 108911   Accepted: 21866 Descript ...

随机推荐

  1. 关于GIT的一些注意点

    往空仓库提交代码之前先将文档区的_gitignore放到项目根目录然后改名成.gitignore然后git add .gitignore以上的目的是忽略一些不应该提交GIT的文件,多人编辑工程的时候不 ...

  2. iOS消息传递机制

    每个应用或多或少都由一些需要相互传递消息的对象结合起来以完成任务.在这篇文章里,我们将介绍所有可用的消息传递机制,并通过例子来介绍怎样在苹果的框架里使用.我们还会选择一些最佳范例来介绍什么时候该用什么 ...

  3. 不仅仅是浏览器 走近Chrome开发人员工具

    Chrome浏览器以其简单.快速.安全.稳定.扩展丰富等特性受到了不少人的喜爱,除了这些特性,Chrome浏览器还提供了非常简单方便的开发人员工具,可以为开发提高效率,加上Chrome浏览器对HTML ...

  4. Nginx下载防盗链(迅雷等下载软件)

    什么是下载盗链   假设我们是一个B站,有些视频资源是可以提供给用户下载的.这时迅雷等其他下载软件,也提供下载该视频的服务, 但是迅雷很不厚道的,将我们的下载资源提供给他的用户,下载.占用我们的带宽来 ...

  5. python中下划线_的用途

    Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx       不能用'from module import *'导入 __xxx__  系统定义名字 __xxx     类中的私有变量 ...

  6. android 电话薄先10位匹配,若是无法匹配,则换成7位匹配

    案例 1: 假设您保存的有:A:04165191666. B:5191666.  来电号码是:04165191666   由于是7位匹配,所以A和B都能够匹配到.可是最佳匹配还是A,最后显示A: 来电 ...

  7. 全面了解linux服务器

    一.查看linux服务器CPU详细情况 判断linux服务器CPU情况的依据如下 具有相同core id的CPU是同一个core的超线程 具有相同physical id的CPU是同一个CPU封装的线程 ...

  8. 奇特的JavaScript连续赋值运算

    一.引子: }; a.x = a = {n:}; alert(a.x); // --> undefined 以上第二句 a.x = a = {n:2} 是一个连续赋值表达式.这个连续赋值表达式在 ...

  9. Gitlab安装部署及基础操作

      环境说明 系统版本 CentOS 7.2 x86_64(较新版本的gitlab集成了更多功能,顺利运行起来的硬件要求较高,这里给了3G内存) 软件版本 gitlab-ce-10.8.4 GitLa ...

  10. angular directive 深入理解

    由于业务的需要,最近angular 的diretive 研究的比较多,有和同事一起共同协作开发scada的项目, 对directive 有了进一步更深的理解. 感觉才开始真正理解了这句话的意思: In ...