| Help me, it's TLE #5. And another question inside. Question:Why do I have to write
 for j:=1 to 4 do begin
 read(b);
 a[i,j]:=b;
 end;
 instead of
 read(a[i,1],a[i,2],a[i,3],a[i,4]);
 ?
 
 
 program ural1318;
 const
 maxn=5000;
 base=4294967296;
 maxe=38;
 type
 bignum=array[1..4]of int64;
 var
 e:array[0..maxe]of bignum;
 a:array[1..maxn]of bignum;
 n,i,j:word;
 ans,b:cardinal;
 function x(a,b:bignum):bignum;
 var
 i:byte;
 begin
 for i:=1 to 4 do
 x[i]:=a[i] xor b[i];
 end;
 function smaller(a,b:bignum):boolean;
 var
 i:byte;
 begin
 for i:=1 to 4 do
 if a[i]<b[i] then begin
 smaller:=true;exit;
 end
 else if a[i]>b[i] then begin
 smaller:=false;exit;
 end;
 smaller:=false;
 end;
 function f(a:bignum):byte;
 var
 l,r,m:byte;
 begin
 l:=0;r:=maxe;
 repeat
 m:=(l+r+1) div 2;
 if smaller(a,e[m]) then r:=m-1 else l:=m;
 until l=r;
 f:=l;
 end;
 begin
 e[0,4]:=1;
 for i:=1 to maxe do
 for j:=4 downto 1 do begin
 inc(e[i,j],e[i-1,j]*10);
 if e[i,j]>=base then begin
 e[i,j-1]:=trunc(e[i,j]/base);
 dec(e[i,j],trunc(e[i,j-1]*base));
 end;
 end;
 e[0,4]:=0;
 
 read(n);
 for i:=1 to n do begin
 for j:=1 to 4 do begin
 read(b);
 a[i,j]:=b;
 end;
 for j:=1 to i-1 do
 inc(ans,f(x(a[i],a[j])));
 end;
 writeln(ans*2);
 end.
Re: Help me, it's TLE #5. And another question inside. In first: it is not correct to show this your solution (even wrong), please clear it, it already too bad.
 In second:
 for I:=1 to N do readln(A[I][0],A[I][1],A[I][2],A[I][3]);
 - is correct pascal-line, where
 type TNum=array[0..3] of longword
 var A:array[1..5000] of TNum;
 
 
 In third: to get AC your are to ULTRA-STRICT optimization.
 That meens some ASM-inline commands (bad way) or
 usual Pascal high-optimized code (depresive way).
 
 For example:
 my AC program (0.703 461 КБ) use two usual cycles (two "repeat", o(n*n/2)), and a LOG calculation code (about 650 lines).
 
 650 lines was generated by my special generation program. This code consists only "IF" operator, "XOR" and
 ":=" operator. Some path of this code here:
 -----BEGIN LOG-FUNCTION----------------------
 v:=A^[0]xor B^[0];
 if v<1 then
 begin
 v:=A^[1]xor B^[1];
 if v<5 then
 begin
 v:=A^[2]xor B^[2];
 if v<2 then
 begin
 v:=A^[3]xor B^[3];
 if v<1 then
 log:=0
 else if v=1 then
 begin
 log:=0;
 end
 else
 begin
 if v<100000 then
 --....---------------------
 if v<232830 then
 begin
 if v<232 then
 begin
 if v<23 then log:=10
 else if v>23 then log:=11
 else
 begin
 v:=A^[3]xor B^[3];
 if v>=1215752192 then log:=11 else log:=10;
 begin
 end;
 end
 end
 else if v>232 then
 begin
 if v<2328 then
 begin
 if v<2328 then log:=12
 else if v>2328 then log:=13
 --....---------------------
 then log:=log*2;
 To generate this code I use several recurse functions and binary search of course.
 Think better and get AC 1318(1/1) as my.
 
 
 
 Edited by author 03.10.2004 11:23
As I've written before, there is nothing difficult at all (+) No assembler, no data structure tricks. The problem can be easily solved via well-optimized precalc...Re: As I've written before, there is nothing difficult at all (+)  Yes, Dmitry 'Diman_YES' Kovalioff the rights.
 0.687s 281kb
 |