需要详细题解就说一声。
#include<cstdio>
int ss[20010],flag[20010],f[20010];
bool v[20010],hash[20010];
int n,num=1;
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
for(int i=2;i<=20000;i++)
{
if(!hash[i])
{
ss[num++]=i;
for(int j=i*i;j<=20000;j+=i) hash[j]=true;
}
flag[i]=num-1;
}
for(int i=2;i<=20000;i++)
for(int j=flag[i];j>=1;j--)
if(!v[i-ss[j]])
{
v[i]=true;
break;
}
//for(int i=1;i<=20;i++) if(v[i]) printf("%d ",i);
for(int i=2;i<=20000;i++)
{
if(v[i])
{
num=30000;
for(int j=flag[i];j>=1;j--)
{
if(!v[i-ss[j]] && f[i-ss[j]] < num)
{
num=f[i-ss[j]];
}
}
f[i]=num+1;
}
else
{
num=-30000;
for(int j=flag[i];j>=1;j--)
{
if(f[i-ss[j]] > num)
{
num=f[i-ss[j]];
}
}
f[i]=num+1;
}
}
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
if(v[x]) printf("%d\n",f[x]);
else printf("-1\n");
}
}