您的位置:首页 > 其它

[vijos1164] 曹冲养猪

2015-08-19 13:22 232 查看

传送门

https://vijos.org/p/1164

题目大意

求解模方程组

题解

是中国剩余定理的裸体

但是我并不想用中国剩余定理,因为它只适用于模数互质

ydcydc数学

参见里面的 将中国剩余定理丢进垃圾桶

ansmoda1=b1 ansmoda2=b2ans\mod a_1=b_1\ \ \ ans\mod a_2=b_2

a1⋅x+b1=a2⋅y+b2a_1\cdot x+b_1=a_2\cdot y+b_2

用扩欧求解一个x,令b=x⋅a1+b1,a=lcm(a1,a2),则将方程合并为了用扩欧求解一个x,令b=x\cdot a_1+b_1,a=lcm(a_1,a_2),则将方程合并为了

xmoda=bx\mod a=b

代码

var
d,e:array[0..20]of int64;
i,j:longint;
n:longint;
a,b,c,x,y,t,v:int64;
function gcd(a,b:int64):int64;
begin
if b=0
then gcd:=a
else gcd:=gcd(b,a mod b);
end;

function lcm(a,b:int64):int64;
begin
lcm:=(a*b)div gcd(a,b);
end;

procedure exgcd(a,b:int64; var x,y:int64);
var t:longint;
begin
if b=0
then begin x:=1; y:=0; end
else begin exgcd(b,a mod b,x,y); t:=x; x:=y; y:=t-y*(a div b); end;
end;

begin
readln(n);
for i:=1 to n do
readln(d[i],e[i]);
for i:=1 to n-1 do
{x*d[i]+e[i]=y*d[i+1]+e[i+1]}
{x*d[i]+y*(-d[i+1])=e[i+1]-e[i]}
begin
a:=d[i]; b:=d[i+1]; c:=e[i+1]-e[i];
{a*x+b*y=c}
t:=gcd(a,b);
a:=a div t; b:=b div t; c:=c div t;
exgcd(a,b,x,y);
x:=x*c div t;
v:=x*t div b;
x:=x-v*b div t;
if x<0 then x:=x+b div t;
x:=(x+b)mod b;
d[i+1]:=lcm(d[i],d[i+1]); e[i+1]:=x*d[i]+e[i];
end;
writeln(e
);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: