【codevs2602】最优分解方案 dp+高精

var
        a:array[1..200] of longint;
        b:array[1..200] of longint;
        len1,len2:longint;
        n:longint;

        procedure inti;
        begin
                readln(n);
        end;

        procedure divi;
        var i:longint;
        begin
                len1:=1;
                while n>len1 do
                begin
                        a[len1]:=len1+1;
                        inc(len1);
                        n:=n-len1;
                end;
                dec(len1);
                if n>0 then
                begin
                        i:=len1;
                        while n>0 do
                        begin
                                inc(a[i]);
                                dec(n);
                                dec(i);
                                if i=0 then i:=len1;
                        end;
                end;
        end;

        procedure mul;
        var i,j:longint;
        begin
                fillchar(b,sizeof(b),0);
                len2:=1;b[1]:=1;
                for i:=1 to len1 do
                begin
                        for j:=1 to len2 do b[j]:=b[j]*a[i];
                        for j:=1 to len2+3 do
                        begin
                                b[j+1]:=b[j+1]+b[j] div 10;
                                b[j]:=b[j] mod 10;
                        end;
                        len2:=len2+4;
                        while b[len2]=0 do dec(len2);
                end;
        end;

        procedure print;
        var i:longint;
        begin
                for i:=len2 downto 1 do write(b[i]);
        end;


        begin
        inti;
        if n<5 then begin write(n-1);end
        else
        begin
                divi;
                mul;
                print;
        end;
        end.

 

 喜欢就收藏一下,vic私人qq:1064864324,加我一起讨论问题,一起进步^-^

posted @ 2015-09-23 21:18  ROLL-THE-FIRST  阅读(170)  评论(0编辑  收藏  举报