【ACM】家喻户晓的中药店(待更)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN___CSDN/article/details/84192714

题目链接:http://acm.nuc.edu.cn/OJ/contest/show/43/1007

【问题描述】

long_xiao和const_hhh是一对恩爱的夫妻。  

他们在京城经营着一家中药店,夫妻二人医术精湛、古道热肠,虽然年过花甲,身体依然硬朗。更重要的是,他们的思维仍然十分活跃,不仅了解大家的要求,还能给他们许多惊喜。  

除了治病救人,他们的中药配方还有舒筋活络,排毒养颜的功效。正因为如此,中药店门庭若市,甚至有人不远千里,慕名而来。  

药店里药材种类繁多,组成的配方也就非常多。为了提高服务质量,店里的伙计灰来灰去将药材和配方进行编号,灰来灰去可以通过配方的编号快速找到所需药材的编号。

一天,店里的伙计灰来灰去提议可以借此机会来向大家普及一下数学知识,夫妻二人表示赞成,决定每周一在店门口的公告栏中发布新的知识点。  

这周一他们提供了一个简单但是有趣的知识点:  

“素数:一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做素数“。  

到了周末,灰来灰去为了检验大家对知识点的掌握情况,使得今天的配方都由三种药材组成,所需的三种药材的编号都为素数,且加起来等于配方的编号。因为会有多种情况出现,灰来灰去使得三个素数的乘积最大。

现在,药店会给你开出一剂配方,编号为n。如果你能把他拆成3个素数的和或者告诉灰来灰去无法拆成3个素数的和,那么灰来灰去就可以快速找到药材,并免费赠送你一副他们的镇店配方。

【输入描述】

输入第一行包含一个正整数T,代表有T次配方的询问。

对于每组数据,输入包含一个正整数n(1<=n<=10000),代表配方的编号。

【输出描述】

对于每组数据,如果n不能写成三个素数的和,输出-1。  
否则在一行从小到大输出三个素数以及最大乘积。

Time Limit Exceeded 

#include <iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;

int a[10005];

void isprime()
{
	memset(a,0,sizeof(a));
	int i;
	for(i=2;i<=10000;i++)
	{
		if(i==2|| i==3)
		{
			a[i]=i;
			continue;
		}
		if(i%6!=1 && i%6!=5)
		{
			a[i]=0;
			continue;
		}
		int t=(int)sqrt(i);
		for(int j=5;j<=t;j+=6)
		{
			if(i%j==0 || i%(j+2)==0)
			{
				a[i]=0;
				break;
			}
		}
		a[i]=i;
	}
}

int main ()
{
	isprime();
	int T,n,i,j,x,y,z,zz;
	long long int Max,r;
	scanf("%d",&T);
	while(T--)
	{
		Max=-1;
		scanf("%d",&n);
		for(i=2;i<=n;i++)
		{
			for(j=2;j<=n;j++)
			{
				if(a[i] && a[j])
				{
					z=n-a[i]-a[j];
					if(z>=2 && a[z])
					{
						r=a[i]*a[j]*z;
						if(r>Max )
						{
							Max=r;
							x=min(a[i],min(a[j],z));
							zz=max(a[i],max(a[j],z));
							y=n-x-zz;
						}
					}
				}
			}
		}
		if(Max==-1)
		{
			printf("-1\n");
		}
		else
		{
			printf("%d %d %d %d\n",x,y,zz,Max);
		}
	}
	return 0;
}

 

猜你喜欢

转载自blog.csdn.net/CSDN___CSDN/article/details/84192714