zoukankan      html  css  js  c++  java
  • 洛谷 p1516 青蛙的约会 题解

    dalao们真是太强了,吊打我无名蒟蒻

    我连题解都看不懂,在此篇题解中,我尽量用语言描述,不用公式推导(dalao喜欢看公式的话绕道,这篇题解留给像我一样弱的)

    进入正题

    如果不会扩展欧里几德的话请先去做

    洛谷 p1082 同余方程

    设跳了k次

    所以km - kn + x - y = 0(mod l)
    所以k(m - n) + h * l = y - x
    这个移项应该没问题吧

    设(m - n)为a,k为x,h为y,
    l为b,(y - x)为m

    那么转换为ax + by = m
    根据裴蜀定理ax + by = gcd(a,b)有解

    但不代表ax + by = m无解
    我们可以让等式两边同除一个m,再同乘一个gcd(a,b)

    就成了ax / m * gcd(a,b) + by / m * gcd(a,b) = gcd(a,b)

    把(x / m * gcd(a,b))作为新的x,(y / m * gcd(a,b))作为新的y

    再利用扩展欧里几德可以求出新的x
    即(x / m * gcd(a,b))

    我们如果求出了(x / m * gcd(a,b)),那么也可以求出x(乘一个m再除一个gcd就好了)

    但是这并不意味这每个方程都有解,因为我们的x代表的是k
    也就是x代表跳的次数,所以仅可以作为整数
    也就是如果我们必须让 m整除gcd(a,b)即m % gcd(a,b) == 0
    如果m % gcd(a,b)不等于0,那么方程无解

    #include<bits/stdc++.h>
    
    using namespace std;
    
    inline long long read(){long long s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;}
    
    long long xx,yy,t,AC = 0;
    
    long long gcd(long long x,long long y){//求gcd
    	if(y == 0) return x;
    	return gcd(y,x % y);
    }
    
    void exgcd(long long a,long long b){//正宗exgcd
    	if(b == 0){
    		xx = 1;
    		yy = 0;
    		return ;
    	}
    	exgcd(b,a % b);
    	t = xx;
    	xx = yy;
    	yy = t - a / b * yy;
    }
    
    int main()
    {
    	long long x = read(),y = read();
    	long long m = read(),n = read();
    	long long l = read();
    
    	long long a = n - m,b = l,mm = x - y;
    	if(a < 0){//我们让第一只青蛙开始再第二只后面,如果不是这样就调换位置(~~因为青蛙是一样的~~)
    		mm = -mm;
    		a = -a;
    	}
    	long long g = gcd(a,b);
    	long long t = b / g;
    
    	if(mm % g){//不是0则无解
    		cout<<"Impossible"<<endl;
    		return AC;
    	}
    
    	exgcd(a,b);
    	long long ans = xx * (mm / g);//我以为答案就是这样
    
    	cout<<(ans % t + t) % t<<endl;//至于%t+t%t也是看了其他大佬的题解才知道的,不过我并不知道为什么,(太弱了,雾)
    
    	return AC;//返回AC保平安
    }
    
    
  • 相关阅读:
    Linux服务器程序规范化
    Linux I/O函数
    IP协议详解
    Linux C++ 连接 MySQL
    I/O复用
    Linux网络编程基础API
    TCP协议详解
    React源码解携(二): 走一趟render流程
    记账项目 webpack优化
    前端监控系统博客总结
  • 原文地址:https://www.cnblogs.com/lztzs/p/11358471.html
Copyright © 2011-2022 走看看