zoukankan      html  css  js  c++  java
  • 【题解】P1516 青蛙的约会(Exgcd)

    洛谷P1516:https://www.luogu.org/problemnew/show/P1516

    思路:

    设两只青蛙跳了T步 则A的坐标为X+mT   B的坐标为Y+nT

    要使他们相遇 则满足:X+mT-(Y+nT)=L*t   (t为整数)

    即可推得:(n-m)*T+L*t=X-Y   由此可得 a*x+b*y=c

    a1=a/gcd(n-m,L)   b1=b/gcd(n-m,L)   c1=c/gcd(n-m,L)

     

    1. 用exgcd求解上述公式得出一个解x,但这并不一定是最后的解
    2. 若(X-Y)%gcd(n-m,L)≠0 即gcd不整除c时 或者m=n时 即m-n=0 无解 否则跳到第3步
    3. 有解后:设d=gcd(n-m,L)     特解为x=x*(X-Y)/d 即x0=x1*c1    通解为x=x*(X-Y)/d+k(L/d) 即x=x0+k*b1
    4. 最小正整数解ans=(x%(L/d)+L/d)%(L/d) 即ans=(x%b1+b1)%b1

    代码:

    #include<iostream>
    #include<cmath>
    #include<cstdio>
    using namespace std;
    #define ll long long
    ll x,y,m,n,l;
    void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
    {
        if(!b)
        {
            x=1;
            y=0;
            d=a;
        }
        else
        {
            exgcd(b,a%b,d,x,y);
            int t=x;
            x=y;
            y=t-a/b*y;
        }
    }
    int main()
    {
        ll a,b,d;
        cin>>x>>y>>m>>n>>l;
        if(n<m)
        {
            swap(m,n);
            swap(x,y);//保证n-m>0 
        }
        exgcd(n-m,l,d,a,b);//求出特解x0 
        if((x-y)%d!=0||m==n)
        cout<<"Impossible
    ";//无解情况 
        else
        cout<<(a*(x-y)/d%(l/d)+(l/d))%(l/d)<<endl;//输出最小正整数解 
    }
    View Code
  • 相关阅读:
    poj 3243 Clever Y(BabyStep GiantStep)
    poj 2417 Discrete Logging
    poj 3481 Double Queue
    hdu 4046 Panda
    hdu 2896 病毒侵袭
    poj 1442 Black Box
    hdu 2815 Mod Tree
    hdu 3065 病毒侵袭持续中
    hdu 1576 A/B
    所有控件
  • 原文地址:https://www.cnblogs.com/BrokenString/p/9651556.html
Copyright © 2011-2022 走看看