|  | 
|  | 
| back to board | Please help!!! (almosat correct program inside) Can anyone tell me what is wrong with this program? I get WA. I usedbignums, but instead of representing the numbers in base 10, i did it
 in base 1000. I checked all my answers with my slow program (which
 got TLE) and they seem to be right. Here's the code:
 
 
 type bignum=array[0..35000] of longint;
 var a,b:bignum;
 n,i,j:longint;
 procedure subs(var x,y:bignum);
 var i:longint;
 begin
 for i:=x[0] downto 1 do
 if i<=y[0] then begin
 x[i]:=x[i]-y[i];
 if x[i]<0 then begin
 dec(x[i+1]); x[i]:=x[i]+1000;
 end;
 end;
 while x[x[0]]=0 do dec(x[0]);
 end;
 procedure square(a:bignum; var b:bignum);
 var i,j:longint;
 begin
 fillchar(b,sizeof(b),0);
 b[0]:=2*a[0];
 for i:=1 to a[0] do
 for j:=1 to a[0] do
 b[i+j-1]:=b[i+j-1]+a[i]*a[j];
 for i:=1 to b[0]-1 do
 if  b[i]>999 then begin
 b[i+1]:=b[i+1]+b[i] div 1000;
 b[i]:=b[i] mod 1000;
 end;
 if b[b[0]]=0 then dec(b[0]);
 end;
 begin
 readln(n);
 fillchar(a,sizeof(a),0);
 a[0]:=1; a[1]:=2;
 writeln('2');
 for i:=2 to n do begin
 square(a,b);
 subs(b,a);
 inc(b[1]);
 k:=1;
 while b[k]>999 do begin
 b[k]:=b[k] mod 1000;
 inc(k);
 inc(b[k]);
 end;
 if k>b[0] then inc(b[0]);
 a:=b;
 for j:=a[0] downto 1 do begin
 if (j<>a[0]) and (a[j]<100) then write('0');
 if (j<>a[0]) and (a[j]<10) then write('0');
 write(a[j]);
 end;
 writeln;
 end;
 end.
Re: Here is my AC solution,I think it can help you Posted by ACer  4 Jul 2003 20:49const max=30000;type arr=array[1..max] of longint;
 var
 c,a,b:arr;
 
 i,j,n,k,l,t:longint;
 
 procedure chen;
 var i,j,k:longint;
 begin
 i:=max;k:=max;
 while a[i]=0 do dec(i);
 while b[k]=0 do dec(k);
 l:=i+k;
 repeat
 j:=0;
 repeat
 inc(j);
 c[i+j-1]:=c[i+j-1]+a[i]*b[j];
 until j>=k;
 dec(i);
 until i<=0;
 
 end;
 begin
 readln(n);a[1]:=2;b[1]:=1;
 writeln(2);
 l:=1;
 for i:=2 to n do begin
 fillchar(c,sizeof(c),0);
 chen;
 a:=c;
 for j:=1 to max do
 if a[j]>=100 then begin
 a[j+1]:=a[j+1]+a[j] div 100;
 a[j]:=a[j] mod 100;
 end;
 b:=a;
 inc(a[1]);j:=1;
 while a[j]>=100 do begin
 a[j+1]:=a[j+1]+a[j] div 100;
 a[j]:=a[j] mod 100;
 end;
 k:=maX;
 while a[k]=0 do dec(k);
 write(a[k]);
 for j:=k-1 downto 1 do
 if a[j]=0 then write('00')
 else
 begin
 t:=10;
 while a[j]<t do
 begin
 write('0');
 t:=t div 10;
 
 end;
 write(a[j]);
 end;
 writeln;
 end;
 
 end.
Thank you! Thank you, I got AC!Couldn't find the bug in my first program, it gave the same results
 as yours up to test 10, after tha they were to big to check, but I
 rewrote it from scrap and got AC!
 | 
 | 
|