zoukankan      html  css  js  c++  java
  • 洛谷 P1516 青蛙的约会

    题目描述

    两青蛙会相遇的条件[(x-y)+k(m-n)]%l=0
    令a=m-n,b=l,c=x-y,所以(c+k*a)%b=0 -> aX+bY=c
    方程有解,当且仅当c%Gcd(a,b)=0
    令r=Gcd(a,b)
    为什么(X*(c/r)%(b/r)+b/r)%(b/r)为最小解?
    目标解aX+bY==c
    有解的条件是c%r=0,也就是c=K*r
    那么就办成了aX+bY=K*r
    那么也就是解a*(X/K)+b(Y/K)=r
    然后扩展欧几里得定理就是解a*X+b*Y=r
    那么解出来X之后X就要乘上K也就是要乘上c/r
    为了防止负数输出

    #include<complex>
    #include<cstdio>
    using namespace std;
    long long x,y,l,x1,x2,m,n;
    long long Exgcd(long long a,long long b,long long &x,long long &y)
    {
        if(!b)
        {
            x=1;y=0;
            return a;
        }
        int r=Exgcd(b,a%b,x,y),tmp=x;
        x=y;y=tmp-a/b*y;
        return r;
    }
    int main()
    {
        scanf("%d%d%d%d%d",&x1,&x2,&m,&n,&l);
        if(m<n)swap(m,n),swap(x1,x2);
        int c=x2-x1,b=m-n;
        long long r=Exgcd(b,l,x,y);
        if(c%r)printf("Impossible\n");
        else printf("%lld\n",(x*(c/r)+l/r)%(l/r));
        return 0;
    }
  • 相关阅读:
    Python学习-if条件语句
    Python学习-变量
    认识Python
    win7分盘
    mysql环境变量配置
    mysql的下载及配置
    c# excel xls保存
    js 在线引用
    js layer.js
    vue day3 bootstrap 联动下拉
  • 原文地址:https://www.cnblogs.com/LeTri/p/8531049.html
Copyright © 2011-2022 走看看