POJ1061 青蛙的约会

现在才AC这道题,无限囧。。记得老早就看过这道题

题目大意:青蛙A的出发点为x,青蛙B的出发点为y,A跳一次m米,B跳一次n米。所在的纬度线(一圈)为L;

思路:扩展欧几里得的入门题:

(1)、两者相遇的条件:x+mt-y-nt=pL

(n-m)t+Lp=x-y;

即是:at+bp=x-y

求出最小的t

所以先要求出gcd(a,b);

即是:exgcd(n-m,L,ar,br);//ar,br对应于关系于t,p;

此函数返回  M=gcd(n-m,L);

                    X=ar(对应的关系);

(2)、如果(x-y)%M==0,则有解

(3)、有解后:X=X(x-y)/M;

最后:(X%(L/M)+L/M)%(L/M)就是最后的解,也就是本题中t的值;(写了这些感觉都是在默写~~还不是很透彻理解~~囧。。)


AC program:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
typedef __int64 LL ; 
LL exgcd(LL a,LL b,LL &x,LL &y) 
{
    LL t,d;
    if(b==0)
    {
      x=1;
      y=0;
      return a;        
    }
    d=exgcd(b,a%b,x,y);
    t=x;
    x=y;
    y=t-(a/b)*y;
    return d;      
} 
int main()
{
 LL x,y,m,n,l;
 while(cin>>x>>y>>m>>n>>l)
 {
   LL ar,br,M; 
   M=exgcd(n-m,l,ar,br);
   if((x-y)%M || m==n)
      cout<<"Impossible"<<endl;
   else
   {
     ar=ar*(x-y)/M;
     LL s=l/M; 
     cout<<(ar%s+s)%s<<endl;    
   } 
   
 }    
} 


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值