题目好暴力啊
题目链接:青蛙的约会
代码:(里面有注释)
//EXGCD:返回的值为最大公约数,但是里面已经处理了x,y
#include<cstdio>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll x,y,n,m,l,a,b;
ll gcd(ll aa,ll bb)
{
return bb?gcd(bb,aa%bb):aa;
}
ll exgcd(ll aaa,ll bbb,ll& a,ll& b)
{
if(!bbb)
{
a=1;
b=0;
return aaa;
}
ll r=exgcd(bbb,aaa%bbb,b,a);
b-=aaa/bbb*a;
return r;
}
int main()
{
scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
if(n-m<0)
{
swap(n,m);
swap(x,y);
}
if((y-x)%gcd(n-m,l)!=0)
{
cout<<"Impossible";
return 0;
}
ll ans=exgcd(n-m,l,a,b);
printf("%lld",(a*((x-y)/ans)%(l/ans)+(l/ans))%(l/ans));//[1]a*(x-y)/ans原因:因为最初用的式子为EXGCD的,方程右侧为gcd(a,b),而我们最初的方程为ax+by=c,所以我们要*c/gcd(a,b)
return 0;//[2] ans即为最大公约数
}
//mk+x=nk+y
//(m-n)k===y-x(mod l)
//(m-n)k-y+x=l*q
//(m-n)a-l*b=y-x
//y-x/gcd(m-n,l)
//7 22 3
//ax+by=gcd(a,b)
扩欧模板:
#include<cstdio>
#include<iostream>
using namespace std;
long long exgcd(long long a,long long b,long long& x,long long& y)
{
if(!b)
{
x=1;
y=0;
return a;
}
long long r=exgcd(b,a%b,y,x);
y-=a/b*x;
return r;
}
long long x,y;
int main()
{
long long a,b;
cin>>a>>b;
long long ans=exgcd(a,b,x,y);
cout<<ans<<" "<<x<<" "<<y;
return 0;
}