您的位置:首页 > 其它

rqnoj-116-质数取石子

2013-10-15 07:55 246 查看
需要详细题解就说一声。

#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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: