|  | 
|  | 
| back to board | What is wrong? Way WA on test 1? Posted by ss  29 Mar 2005 18:07|var t:longint;|    x,i,a,b,c,len:longint;
 |    ar:array[1..11000]of longint;
 |
 |
 |function simple(x:longint):boolean;
 |var i:integer;
 |begin
 |  if x=1 then begin simple:=false; exit; end;
 |  for i:=2 to trunc(sqrt(x))do
 |    if x mod i =0 then begin
 |      simple:=false;
 |      exit
 |    end;
 |  simple:=true;
 |end;
 |
 |procedure razb(x:longint;var a,b,c:longint);
 |var i,j,k:longint;
 |begin
 |  j:=1;
 |  i:=1;
 |  while (ar[i]<=x) and (i<=len) do begin
 |    j:=i;
 |    while (ar[j]<=x)and (j<=len) do begin
 |      if x-ar[i]-ar[j]>=0 then
 |         if simple(x-ar[i]-ar[j]) then begin
 |            a:=ar[i];
 |            b:=ar[j];
 |            c:=x-ar[i]-ar[j];
 |          if(a=0) or(b=0) or(c=0) then begin
 |            a:=ar[i];
 |            b:=ar[j];
 |            c:=x-ar[i]-ar[j];
 |            exit;
 |          end
 |        end;
 |        inc(j);
 |       end;
 |    inc(i);
 |  end;
 |end;
 |
 |
 |begin
 |  t:=1;
 |  for i:=2 to 100000 do
 |    if simple(i) then begin
 |      ar[t]:=i;
 |      inc(t);
 |    end;
 |  len:=t;
 |  readln(t);
 |  for i:=1 to t do begin
 |    readln(x);
 |    if simple(x) then begin writeln(x); continue; end
 |    else razb(x,a,b,c);
 |    if a<>0 then write(a,' ');
 |    if b<>0 then write(b,' ');
 |    if c<>0 then writeln(c,' ');
 |  end;
 |end.
 | 
 | 
|