题意:求将N分成K个不同质数的和的方案数.
分析:筛法,然后直接背包之~~.
code:
const MAX=1200; maxn=1200; maxk=15; var Prime:array[0..MAX] of longint; P:array[0..MAX] of boolean; f:array[0..maxn,0..maxk] of longint; size,n,k,i,j,o,tmp:longint; procedure GetPrime; begin size:=0; fillchar(P,sizeof(P),0); for i:=2 to MAX do begin if not P[i] then begin inc(size); prime[size]:=i; end; j:=1; while (j<=size)and(prime[j]*i<MAX) do begin P[i*prime[j]]:=true; if i mod prime[j]=0 then break; inc(j); end; end; end; begin GetPrime; while not seekeof do begin readln(n,k); if n+k=0 then break; tmp:=0; while prime[tmp]<=n do inc(tmp); dec(tmp); fillchar(f,sizeof(f),0); f[0,0]:=1; for o:=1 to tmp do for i:=n downto prime[o] do for j:=1 to k do f[i,j]:=f[i,j]+f[i-prime[o],j-1]; writeln(f[n,k]); end; end.