题解 P1516 【青蛙的约会】
很容易想到,如果他们相遇,他们初始的位置坐标之差
转化一下,不就变成了让我们求一个不定方程
设
首先,设
这时,因为
否则,等式两边同乘
那么,
如何由一个解得到其它解呢?有一个恒等式
在保证
如果解出的
代码就可以直接写(x%(b/g)+b/g)%(b/g)
然后就可以交上去了,发现获得了70分
怎么回事?因为
总之,虽然是裸的exgcd题,但是很容易被细节实现坑到,尤其是求最小非负整数解和处理
#include<cstdio>
#define LL long long
LL x,y,m,n,l,a,b,c,x0,y0,g,tmp;
void exgcd(LL a,LL b){
if(!b){x0=1;g=a;return;}//顺便求gcd
exgcd(b,a%b);
tmp=x0;x0=y0;y0=tmp-a/b*y0;
}
int main(){
scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
a=n-m;b=l;c=x-y;
if(a<0)a=-a,c=-c;//处理a为负数情况
exgcd(a,b);
if(c%g)puts("Impossible");
else printf("%lld\n",(c/g*x0%(b/g)+b/g)%(b/g));//求最小非负整数解
return 0;
}