Cod sursa(job #78819)

Utilizator gurneySachelarie Bogdan gurney Data 19 august 2007 20:39:53
Problema Reguli Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.43 kb
program reguli;
  const
    fin='reguli.in';
    fout='reguli.out';
  var
    a:array[1..500100] of int64;
    pi:array[1..500100] of longint;
    d,q,i,c,r,j,k,n:longint;
    t:array[0..1] of int64;
    old,new:longint;
    x,y:int64;
    s:string;
    ok:array[1..500100] of boolean;
begin
  assign(input,fin);
    reset(input);
    readln(n);
    for i:=1 to n do
      begin
        readln(s);
        k:=1;
        if s[1]='-' then
          k:=2;
        for j:=k to length(s) do
          a[i]:=a[i]*10+(ord(s[j])-48);
        if k=2 then
          a[i]:=a[i]*(-1);
      end;
    for i:=1 to n-1 do
      a[i]:=a[i+1]-a[i];
    dec(n);
  assign(output,fout);
    rewrite(output);
    k:=0;
    pi[1]:=0;
    for q:=2 to n do
      begin
        while (k>0) and (a[k+1]<>a[q]) do
          k:=pi[k];
        if a[k+1]=a[q] then
          inc(k);
        pi[q]:=k;
      end;
    k:=n;
    while k>0 do
      begin
        ok[pi[k]]:=true;
        k:=pi[k];
      end;
    for d:=1 to n do
      begin
        c:=n div d;
        r:=n-c*d;
        if ok[r] then
        begin
          x:=n-r-pi[n-r];
          y:=(n-r) div x;
          if (x<>0) then
            if (y=(n-r)/x)and(y=c) then
              begin
                writeln(d);
                for i:=1 to d do
                  writeln(a[i]);
                break;
              end;
        end;
      end;
  close(output);
end.