题意:求将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.