bzoj 1025 DP

6088 단어 ZOJ
이 문제는 군론의 기초 지식에 근거하여 우리는 n을 몇 개의 수로 나누어 이 수를 구할 수 있다
의 lcm 시나리오 수
먼저 소수표 prime
그러면 우리는 DP로 이 문제를 해결할 수 있다. W[I,J]로 I라는 수를 대표하고 몇 개의 수로 나누어
그 중에서 질인수가 가장 큰prime[j]의 방안 수를 초과하지 않는다
그러면 우리는 W[I, J]:=W[I, J-1]+ΣW[I-prime[j]^k,j-1] (I>=prime[j])
 
/**************************************************************

    Problem: 1025

    User: BLADEVIL

    Language: Pascal

    Result: Accepted

    Time:44 ms

    Memory:8220 kb

****************************************************************/

 

//By BLADEVIL

var

    prime                       :array[0..1010] of longint;

    mindiv                      :array[0..1010] of longint;

    i, j                        :longint;

    n                           :longint;

    w                           :array[0..1010,0..1010] of int64;

    cur                         :longint;

     

begin

    read(n);

    for i:=2 to n do

    begin

        if mindiv[i]=0 then

        begin

            inc(prime[0]);

            prime[prime[0]]:=i;

            mindiv[i]:=i;

        end;

        for j:=1 to prime[0] do

        begin

            if prime[j]*i>n then break;

            mindiv[prime[j]*i]:=prime[j];

            if i mod prime[j]=0 then break;

        end;

    end;

     

    for i:=0 to n do w[i,0]:=1;

    for i:=1 to prime[0] do w[0,i]:=1;

     

    for j:=1 to prime[0] do

        for i:=1 to n do

        begin

            w[i,j]:=w[i,j-1];

            cur:=prime[j];

            while i-cur>=0 do

            begin

                w[i,j]:=w[i,j]+w[i-cur,j-1];

                cur:=cur*prime[j];

            end;

        end;

    writeln(w[n,prime[0]]);

end.

좋은 웹페이지 즐겨찾기