dalao们真是太强了,吊打我无名蒟蒻c++
我连题解都看不懂,在此篇题解中,我尽可能用语言描述,不用公式推导(dalao喜欢看公式的话绕道,这篇题解留给像我同样弱的)spa
进入正题code
若是不会扩展欧里几德的话请先去作get
洛谷 p1082 同余方程it
设跳了k次class
因此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)为mgc
那么转换为ax + by = m
根据裴蜀定理ax + by = gcd(a,b)有解语言
但不表明ax + by = m无解
咱们能够让等式两边同除一个m,再同乘一个gcd(a,b)while
就成了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保平安 }