MYSTERY - Số huyền bí

Tác giả: ll931110

Ngôn ngữ: Pascal

Program MYSTERY;
        Const
                input  = '';
                output = '';
                num    = 20122007;
                con    = 2279340;
        Var
                a,n: longint;
                k: array[1..100000] of longint;
                s: int64;

Procedure init;
          Var
                f: text;
          Begin
                Assign(f, input);
                        Reset(f);
                        Readln(f, a);
                Close(f);
          End;

Procedure gens;
          Var
                i: longint;
          Begin
                n:= 0;

                For i:= 1 to trunc(sqrt(a)) do
                        if a mod i = 0 then
                                Begin
                                        inc(n);
                                        k[n]:= i mod con;

                                        If i * i <> a then
                                                Begin
                                                        inc(n);
                                                        k[n]:= (a div i) mod con;
                                                End;
                                End;
          End;

Function power(x,p,q: longint): int64;
         Var
                u: int64;
         Begin
                If p = 0 then exit(1);

                u:= power(x,p div 2,q);
                If odd(p) then power:= (u * u * x) mod q
                          else power:= (u * u) mod q;
         End;

Procedure solve;
          Var
                f: text;
                i,j: longint;
          Begin
                Assign(f, output);
                        Rewrite(f);

                        s:= 1;
                        For i:= 1 to n do
                                s:= s * (power(3,k[i],num) - 1) mod num;

                        Writeln(f, s);
                Close(f);
          End;


Begin
        init;
        gens;
        solve;
End.

Download