NUC-家喻户晓的中药店

问题描述

long_xiao和const_hhh是一对恩爱的夫妻。
他们在京城经营着一家中药店,夫妻二人医术精湛、古道热肠,虽然年过花甲,身体依然硬朗。更重要的是,他们的思维仍然十分活跃,不仅了解大家的要求,还能给他们许多惊喜。
除了治病救人,他们的中药配方还有舒筋活络,排毒养颜的功效。正因为如此,中药店门庭若市,甚至有人不远千里,慕名而来。
药店里药材种类繁多,组成的配方也就非常多。为了提高服务质量,店里的伙计灰来灰去将药材和配方进行编号,灰来灰去可以通过配方的编号快速找到所需药材的编号。
一天,店里的伙计灰来灰去提议可以借此机会来向大家普及一下数学知识,夫妻二人表示赞成,决定每周一在店门口的公告栏中发布新的知识点。
这周一他们提供了一个简单但是有趣的知识点:
“素数:一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做素数“。
到了周末,灰来灰去为了检验大家对知识点的掌握情况,使得今天的配方都由三种药材组成,所需的三种药材的编号都为素数,且加起来等于配方的编号。因为会有多种情况出现,灰来灰去使得三个素数的乘积最大。
现在,药店会给你开出一剂配方,编号为n。如果你能把他拆成3个素数的和或者告诉灰来灰去无法拆成3个素数的和,那么灰来灰去就可以快速找到药材,并免费赠送你一副他们的镇店配方。

输入描述

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

输出描述

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

样例输入

2
20
3

样例输出

2 7 11 154
-1

来源 中北大学2017年程序设计新生赛

这道题不难,但是我wa了六七发,菜菜菜!
数据量不大,用不到欧拉线性筛,但还是用了,顺便复习一下,为明天的新生赛做准备,没好好读题,没有按照从小到大输出贡献了两发,一定要好好读题,一定要

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5;
bool isprime[N];
int prime[N];
void Prime() {
	int cut=0;
	for(int i=2; i<N; ++i) {
		if(!isprime[i])prime[cut++]=i;
		for(int j=0; j<cut&&i*prime[j]<N; ++j) {
			isprime[i*prime[j]]=true;
			if(i%prime[j]==0)break;
		}
	}
}
int main() {
	Prime();
	int T;
	scanf("%d",&T);
	while(T--) {
		int n;
		ll a=0,b=0,c=0,ans=0;
		scanf("%d",&n);
		for(int i=0; prime[i]<n; ++i) {
			for(int j=i; prime[j]<n; ++j) {
				if(!isprime[n-prime[i]-prime[j]]&&n-prime[i]-prime[j]>=prime[j]) {
					a=prime[i],b=prime[j],c=n-prime[i]-prime[j];
					ans=max(ans,(ll)a*b*c);
				}
			}
		}
		if(ans) {
			printf("%d %d %d %lld\n",a,b,c,ans);
		} else {
			printf("-1\n");
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值