P1516 青蛙的约会

本题就是个数学题....我们要通过题目列出一个有解情况的方程。

第一只青蛙在跳了T次时是位于x+mt.

第二只青蛙同理是位于y+nt.

他们相遇便需要满足两者的差S是个整数,可列一方程:

(n-m)t+S=x-y

变成了一个ax+by=c形式,利用拓展欧几里德求解。

然后判断以下不存在解的情况,有解的话d=gcd(n-m,l),特解x1=x1(x-y)/d,通解为x1=x1(x-y)/d+k(l/d).

ans就是(x%(l/d)+l/d)%(l/d).

#include<iostream>
#include<cstdio>
using namespace std;
long long x,y,n,m,l;
void euclid(long long a,long long b, long long &d,long long &x,long long &y)
{
    if(!b)
    {
        x=1;y=0;d=a;
    }
    else 
    {
        euclid(b,a%b,d,x,y);
        int t=x;x=y;y=t-a/b*y;
    }
}
int main()
{
    long long a,b,d;
    scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
    if(n<m)
    {
        swap(m,n);
        swap(x,y);
    }
    euclid(n-m,l,d,a,b);
    if((x-y)%d!=0 || m==n) printf("Impossible");
    else 
    {
        printf("%d",(a*(x-y)/d%(l/d)+(l/d))%(l/d));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/LSWorld/p/euclid1.html