Cod sursa(job #589831)

Utilizator vendettaSalajan Razvan vendetta Data 13 mai 2011 21:56:06
Problema Suma divizorilor Scor 40
Compilator fpc Status done
Runda Arhiva de probleme Marime 3.49 kb

const FIN = 'sumdiv.in' ;
      FOU = 'sumdiv.out' ;
      MAX = 1100005 ;
      MDD = 9901 ;

var P : array [ 0 .. MAX ] of longint ;
    a, b, T : longint ;
    V : array [ 0.. 1 shl 17 ] of byte ;
    N : int64 ;

    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 ) : int64 ;
        var i: longint ;
            sol : int64;

        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, sum, 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, MDD - 2 ) ); 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 ) ;
            writeln( sum );
        end ;




    begin
        assign ( input, FIN ) ; reset ( input ) ;
        assign ( output, FOU ) ; rewrite ( output ) ;

        prec ;
        readln( a, b );
        n := pow(a,b);
        ssnd(n);
        //ssnd(pow(a,b));
        //writeln( sum );
        close ( input ) ; close ( output ) ;
    end .