题目链接:P1516 青蛙的约会
考察拓欧与推式子(qwq)。
题意翻译?
求满足
[egin{cases}md+xequiv tpmod{l}\nd+yequiv tpmod{l}end{cases}
]
的最小整数解(d)。
我们设(以下均满足(ngeqslant m)):
[egin{cases}md+x=y_1l+t\nd+y=y_2l+tend{cases}
]
两式相减,即得:
[(n-m)d+(y-x)=l(y_2-y_1)
]
这样我们就把不确定的(t)消掉了!
我们再把它转化成模(l)意义的 :
[(n-m)dequiv x-y+lpmod{l}
]
扩欧解方程即可,无解即为(Impossible)。
时间复杂度是(O(logn)),可以通过本题。
(Code):
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
long long l,x,y,m,n;
inline void exgcd(ll a,ll b)
{
if(b==0)
{
x=1,y=0;
return;
}
exgcd(b,a%b);
ll t=x;
x=y;
y=t-a/b*y;
}
ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}
void solve(ll a,ll b,ll c)
{
ll g=gcd(a,b);
if(c%g!=0)
{
printf("Impossible
");
return;
}
a/=g,b/=g,c/=g;
exgcd(a,b);
x=x*c;
x=(x%b+b)%b;
printf("%lld
",x);
}
int main()
{
scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
if(n<m) swap(x,y),swap(m,n);
solve((n-m)%l,l,(x-y+l)%l);
return 0;
}