Cod sursa(job #571282)

Utilizator vendettaSalajan Razvan vendetta Data 4 aprilie 2011 11:19:33
Problema Suma si numarul divizorilor Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 3.74 kb
const f='sumdiv2.in';g='sumdiv2.out';

//program ssnd1 ;
    MAX = 1000005 ;
    //MDD = 9973 ;
var
    P : array [ 0 .. MAX ] of longint ;
    maxb, a1, T,i1, j1,  b1 : longint ;
    V : array [ 0.. 1 shl 17 ] of byte ;
    sum, suma, N : int64 ;
    A : array[ 0 .. max ] of longint;
    b : array[ 1..max,1..2] of longint;
procedure prec ;
    var
        i, j : longint ;

    begin
        inc ( P[0] ) ; P[ P[0] ] := 2 ;
        i := 1 ;
        while ( i * i shl 1 ) + ( i shl 1 ) <= MAX do
            begin
            if ( V[i shr 3] and ( 1 shl ( i and 7 ) ) ) = 0 then
                begin
                j := ( i * i shl 1 ) + ( i shl 1 ) ;
                while ( j shl 1 ) + 1 <= MAX do
                    begin
                    V[j shr 3] := V[j shr 3] or ( 1 shl ( j and 7 ) ) ;
                    inc ( j, ( i shl 1 ) + 1 ) ;
                    end ;
                end ;
            inc ( i ) ;
            end ;

        i := 1 ;
        while ( i shl 1 ) + 1 <= MAX do
            begin
            if ( V[i shr 3] and ( 1 shl ( i and 7 ) ) ) = 0 then
                begin
                inc ( P[0] ) ;
                P[ P[0] ] := ( i shl 1 ) + 1 ;
                end ;
            inc ( i ) ;
            end ;
    end ;

function pow ( N : longint ; P : longint ) : longint ;
    var
        i, sol : longint ;

    begin
        sol := 1 ;{ N := N mod MDD}; i := 0 ;
        while ( 1 shl i ) <= P do
            begin
            if ( ( 1 shl i ) and P ) > 0 then
                begin
                sol := sol * N ;
                //sol := sol mod MDD ;
                end ;
            N := N * N ; //N := N mod MDD ;
            inc ( i ) ;
            end ;
        pow := sol ;
    end ;


procedure ssnd(N : longint ) ;
    var
        i, nr, pp : longint ;
    begin
        //readln ( N ) ;
        nr := 1 ; sum := 1 ; i := 1 ;
        while ( int64 ( P[i] ) * int64 ( P[i] ) <= N ) and ( i <= P[0] ) do
            begin
            if ( N mod P[i] = 0 ) then
                begin
                pp := 0 ;
                while ( N mod P[i] ) = 0 do
                    begin
                    inc ( pp ) ;
                    N := N div P[i] ;
                    end ;
                nr := nr * ( pp + 1 ) ;
                sum := sum * ( pow ( P[i], pp + 1 ) - 1 );// sum := sum mod MDD ;
                sum := sum * ( pow ( P[i] - 1, 1 ) );// sum := sum mod MDD ;
                end ;
            inc ( i ) ;
            end ;

        if ( N > 1 ) then
            begin
            nr := nr shl 1 ;
            sum := sum * ( ( N + 1 ) {mod mdd} ); //sum := sum mod MDD ;
            end ;
        //writeln ( nr, ' ', sum ) ;
    end ;


begin
    assign ( input, f) ; reset ( input ) ;
    assign ( output, g ) ; rewrite ( output ) ;

    prec ; readln ( T ) ;
    for i1 := 1 to t do
        begin
        readln(a1,b1);
        b[i1,1]:=a1;
        b[i1,2]:=b1;
        if b1 > maxb then maxb:=b1;
        end;

    for i1 := 1 to maxb do
        begin
        ssnd(i1);
        A[I1] := sum;
        end;
    for i1 := 1 to t do
        begin
        suma:=0;
        for j1 := b[i1,1] to b[i1,2] do
            suma := suma + a[j1];
        writeln(suma );
        end;
    for i1 := 1 to maxb do write(a[i1],' ');
    //write(')');
    {for i1 := 1 to t do
        begin
        suma := 0;
        readln(a,b);
        for j1 := a to b do
            begin
            ssnd( j1 );
            suma := sum + suma;

            end;
        writeln( suma );
        end;
        }
{    while ( T > 0 ) do
        begin
        ssnd ;
        dec ( T ) ;
        end ;
}
close ( input ) ; close ( output ) ;
end .