最近做了一下SGU106这道题,本来以为是一道很简单的数学题,结果就死活Accept不了……经过几个星期的奋战、参考了别人的程序终于解决了问题。
首先我们可以通过扩展欧几里德算法计算出符合该方程的一组解,之后根据数论推出的公式就可以的解数:
\(\)
\(\)
这个公式有一点参数方程的味道,在算出两侧最大的k以后相减即可。顺便说一句,我感觉上面我被链接解题报告的那位仁兄的程序似乎有些问题,尽管程序都能Accept,但我觉得他的理解有问题:在最开始的特殊情况判断的时候,如果a和b有且仅有一个为零,则应该输出的是其在范围内的长度,而不是1,Saratov State University没有在这里设点,因此没有出现问题。
我当初是ceil()/floor()这两个取整函数写错了,囧死了……其实PASCAL在竞赛的时候可以使用math库,里面都有。
program
sgu106;
var
i,j,k:int64;
a,b,oa,ob,c,x1,x2,y1,y2:int64;
x,y:int64;
tx,ty:int64;
procedure swap(var a,b:int64);
var
t:int64;
begin
t:=a;
a:=b;
b:=t;
end;
function min(a,b:int64):int64;
begin
if a>b
then
min:=b
else
min:=a;
end;
function max(a,b:int64):int64;
begin
if a>b
then
max:=a
else
max:=b;
end;
function ex_euclid(a,b:int64;var x,y:int64):int64;
begin
if b<>0
then
begin
ex_euclid:=ex_euclid(b,a mod b,x,y);
x:=x-(a div b)*y;
swap(x,y);
end
else
begin
x:=1;
y:=0;
ex_euclid:=a;
end;
end;
function ceil(a,b:int64):int64;
var
c:int64;
begin
c:=a div b;
if (a mod b)*b>0
then
ceil:=c+1
else
ceil:=c;
end;
function floor(a,b:int64):int64;
var
c:int64;
begin
c:=a div b;
if (a mod b)*b<0 then floor:=c-1 else floor:=c; end; begin readln(a,b,c); readln(x1,x2); readln(y1,y2); oa:=a; ob:=b; c:=-c; if (x1>x2)or(y1>y2)
then
begin
writeln(0);
halt;
end;
if (b=0)and(a=0)
then
begin
if (c=0)
then
writeln(abs(x2-x1+1)*abs(y2-y1+1))
else
writeln(0);
halt;
end;
if b=0
then
begin
if (c mod a=0)and(c div a>=x1)and(c div a<=x2) then writeln(abs(y2-y1+1)) else writeln(0); halt; end; if a=0 then begin if (c mod b=0)and(c div b>=y1)and(c div b<=y2)
then
writeln(abs(x2-x1+1))
else
writeln(0);
halt;
end;
tx:=1;
ty:=1;
if a<0
then
tx:=-tx;
if b<0
then
ty:=-ty;
if c<0
then
begin
tx:=-tx;
ty:=-ty;
end;
a:=abs(a);
b:=abs(b);
c:=abs(c);
k:=ex_euclid(a,b,x,y);
if c mod k<>0
then
begin
writeln(0);
halt;
end;
x:=x*c div k;
y:=y*c div k;
x:=x*tx;
y:=y*ty;
a:=oa div k;
b:=ob div k;
if (a<0)
then
swap(y1,y2);
if (b<0) then swap(x1,x2); j:=max(ceil(x1-x,b),ceil(y-y2,a)); k:=min(floor(x2-x,b),floor(y-y1,a)); if k>=j
then
writeln(k-j+1)
else
writeln(0);
end.
*上述代码引用时请注明本文链接。
Leave a Reply
You must be logged in to post a comment.