Bà con ơi, xin chỉ giúp bài này tại sao lại điểm không?
program mystery_;
const xxx=20122007; mx=100000000;
type data=int64;
var a,n:data;
d:array[1..mx] of longint;
procedure Uoc(a:data);
var i:longint;
begin
d[1]:=1;n:=1;
for i:=2 to a div 2 do
if a mod i = 0 then begin
n:=n+1;
d[n]:=i;
end;
inc(n);
d[n]:=a;
end;
function mu3(k:longint):data;
begin
if k=0 then mu3:=1
else mu3:=3*mu3(k-1);
end;
function kq(a:data):data;
var i:longint;
Di,Du,mu32:data;
begin
Uoc(a); Du:=1;
for i:=1 to n do begin
mu32:=mu3( d[i] div 2 );
if d[i] mod 2 = 0 then Di:= (mu32 mod xxx)*(mu32 mod xxx)
else Di:

3*mu32 mod xxx)*(mu32 mod xxx)) mod xxx;
Di:=(Di mod xxx - 1);
Du:=(Du*Di) mod xxx;
end;
exit(Du mod xxx);
end;
BEGIN
readln(a);
writeln(kq(a));
END.
Trong khi đó tôi thử chạy với các a từ 1-19, 21-25 đúng, a= 20 kết quả sai. Khi nộp trên vn.spoj kết quả = 0.
Cảm ơn nhiều.