Cod sursa(job #58461)

Utilizator CristinatrifanTrifan Cristina Cristinatrifan Data 5 mai 2007 21:53:06
Problema Pascal Scor 90
Compilator fpc Status done
Runda Arhiva de probleme Marime 3.72 kb
var nrdiv,n,d,ct,j,aux1,aux2,ki,ka:int64;
    i:longint;
    fi,fo:text;
    a:array[1..5000000]of record  prim,doi:longint; end;
function prim(a:byte):boolean;
var i:byte;
begin
     prim:=true;
     for i:=2 to trunc(sqrt(a)) do
        if a mod i=0 then begin prim:=false; break; end;
end;
procedure calc1(n,p:int64);
var i:longint;
begin
     a[p].prim:=1; nrdiv:=0;
     for i:=1 to p-1 do a[i].prim:=0;
     ki:=p+1;
     while ki<=n do
         begin
              j:=ki;
              while j mod p =0 do
                begin
                     inc(nrdiv);
                     j:=j div p;
                end;
              a[ki].prim:=a[ki-1].prim+nrdiv;
              nrdiv:=0;
              inc(ki);
         end;
end;
procedure calc2(n,p:int64);
var i:longint;
begin
     a[p].doi:=1; nrdiv:=0;
     for i:=1 to p-1 do a[i].doi:=0;
     ki:=p+1;
     while ki<=n do
         begin
              j:=ki;
              while j mod p =0 do
                begin
                     inc(nrdiv);
                     j:=j div p;
                end;
              a[ki].doi:=a[ki-1].doi+nrdiv;
              nrdiv:=0;
              inc(ki);
         end;
end;
begin
     assign(fi,'pascal.in'); reset(fi);
     assign(fo,'pascal.out'); rewrite(fo);
     read(fi,n,d);
     if prim(d) then
        begin
             aux1:=d;
             calc1(n,aux1);
             if n mod 2=0 then
                begin
                     for i:=1 to (n-1)div 2 + 1 do
                        if a[n].prim-a[n-i].prim-a[i].prim>0 then inc(ct);
                     if a[n].prim-a[n-((n-1)div 2 + 1)].prim-a[(n-1)div 2 + 1].prim>0 then ct:=ct*2-1
                                                                                      else ct:=ct*2;
                end
                    else begin
                        for i:=1 to (n-1)div 2 do
                            if a[n].prim-a[n-i].prim-a[i].prim>0 then inc(ct);
                        ct:=ct*2; end;
        end
                else begin aux1:=2; aux2:=d div aux1;
     if aux1=aux2 then
        begin
             calc1(n,aux1);
             if n mod 2=0 then
                begin
                     for i:=1 to (n-1)div 2 + 1 do
                        if a[n].prim-a[n-i].prim-a[i].prim>1 then inc(ct);
                     if a[n].prim-a[n-((n-1)div 2 + 1)].prim-a[(n-1)div 2 + 1].prim>1 then ct:=ct*2-1
                                                                                      else ct:=ct*2;
                end
                    else begin
                        for i:=1 to (n-1)div 2 do
                            if a[n].prim-a[n-i].prim-a[i].prim>1 then inc(ct);
                        ct:=ct*2; end;
         end
     else
         begin
              calc1(n,aux1);
              calc2(n,aux2);
              if n mod 2=0 then
                begin
                     for i:=1 to (n-1)div 2 + 1 do
                        if (a[n].prim-a[n-i].prim-a[i].prim>0)and(a[n].doi-a[n-i].doi-a[i].doi>0) then inc(ct);
                     if (a[n].prim-a[n-((n-1)div 2 + 1)].prim-a[(n-1)div 2 + 1].prim>0)and(a[n].doi-a[n-((n-1)div 2 + 1)].doi-a[(n-1)div 2 + 1].doi>0) then ct:=ct*2-1
                                                                                                                                                       else ct:=ct*2;
                end
                    else begin
                        for i:=1 to (n-1)div 2 do
                            if (a[n].prim-a[n-i].prim-a[i].prim>0)and(a[n].doi-a[n-i].doi-a[i].doi>0) then inc(ct);
                        ct:=ct*2; end;
          end;
     end;
     write(fo,ct);
     close(fi);
     close(fo);
end.