似乎叫拓展欧几里得?反正跟我没关系
就是求不定方程ax+by=d的解
然后我自己推了整整三页,,然后发现其中2.9页是废的。。据说LZW大神三行推完真是Orz
嗯接下来开始推
ax+by=gcd(a,b)有整数解
证明:
ax1+by1=gcd(a,b)=gcd(b,a mod b)=bx2+(a mod b)y2
ax1+by1=bx2+(a-[a/b]*b)y2
ax1+by1=bx2+ay2-[a/b]*b*y2
ax1+by1=b(x2-[a/b]y2)+ay2
由待定系数得 x1=y2 y1=x2-[a/b]*y2
就这样一次迭代下去,直到b=0时,此时x1=1
然后再回溯 似乎不大准确? 回去
证明完毕
那么这个有什么用处呢。。
我们可以拿来解萌萌哒的同余方程
ax=k(mod n)
等价于 ax+ny=k
是不是就对了~
青蛙的约会
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 91494 | Accepted: 16791 |
Description
两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面。
我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。
我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。
Input
输入只包括一行5个整数x,y,m,n,L,其中x≠y < 2000000000,0 < m、n < 2000000000,0 < L < 2100000000。
Output
输出碰面所需要的跳跃次数,如果永远不可能碰面则输出一行"Impossible"
Sample Input
1 2 3 4 5
Sample Output
4
Source
嗯就是求mk+x=nk+y(mod L)的k最小值
然后就成了模板题了。。
Code:
var r,x,y,m,n,l,x1,y1,x2,y2,step1,step2,step3:int64;
procedure init;
begin
readln(x,y,m,n,l);
if x=y then begin
writeln(0);
halt;
end;
if m=n then begin
writeln('Impossible');
halt;
end;
end;
Function expandGCD(a,b:longint):longint;
begin
if (b=0) then begin
x1:=1; y1:=0;
exit(a);
end;
expandGCD:=expandGCD(b,a mod b);
x2:=x1; y2:=y1;
x1:=y2; y1:=(x2-a div b*y2);
end;
Procedure swap(var a,b:int64);
var t:longint;
begin
t:=a;
a:=b;
b:=t;
end;
procedure main;
begin
init;
if n>m then begin swap(n,m); swap(x,y); end;
step1:=m-n;
step2:=expandGCD(step1,l);
step3:=y-x;
step3:=((step3 mod l)+l) mod l;
if step3 mod step2<>0 then begin
writeln('Impossible');
exit;
end;
x1:=x1*(step3) div step2;
y1:=y1*(step3) div step2;
l:=l div step2;
x1:=(x1 mod l+l) mod l;
writeln(x1);
end;
begin
main;
end.