题目链接:青蛙的约会
学习博客链接:扩展欧几里得解法
截图也来自 以上博客
画矩形红线的部分我不太苟同,不过他的也可以A。。直接x=(x+n)%n 也是可以的
具体原理我还是不太详细,先贴最基本的模板,以后再学吧。
画椭圆的部分为什么可以这样?先化成
然后答案输出的时候再乘上那个b/gcd(a,n),相当于除了一个整数,求出解后乘上整数k,答案是一样的。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cmath>
typedef long long ll;
using namespace std;
ll x,y,m,n,l;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1;y=0;
return a;
}
ll t=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return t;
}
int main(){
cin>>x>>y>>m>>n>>l;
if(m<n) swap(m, n), swap(x, y);
ll a=0,b=0;
ll t=exgcd(m-n,l,a,b);
if(n==m||(x-y)%t!=0){
printf("Impossible");
return 0;
}
a=(a*(y-x)/t)%l;
a=(a+l)%l;
cout<<a;
return 0;
}