【题目分析】
素数筛+DP
【代码】
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
bool have[1201];
int pri[1200],top=0;
int dp[1121][15],n,m;
int main()
{
memset(have,false,sizeof have);
for (int i=2;i<=1200;++i)
{
if (!have[i]) pri[++top]=i;
for (int j=1;j<=top&&(pri[j]*i)<=1200;++j)
{
// cout<<"out"<<pri[j]*i<<" "<<endl;
have[pri[j]*i]=true;
if (i%pri[j]==0) break;
}
}
memset(dp,0,sizeof dp);
dp[0][0]=1;
for (int i=1;i<=top;++i)
for (int j=1120;j>=pri[i];--j)
for (int k=1;k<=14;++k)
dp[j][k]+=dp[j-pri[i]][k-1];
while (scanf("%d%d",&n,&m)!=EOF&&n&&m)
printf("%d\n",dp[n][m]);
}