Problem Description
Given an integer n, Chiaki would like to find three positive integers x, y and z such that: n=x+y+z, x∣n, y∣n, z∣n and xyz is maximum.
Input
There are multiple test cases. The first line of input contains an integer T (1≤T≤106), indicating the number of test cases. For each test case:
The first line contains an integer n (1≤n≤106).
Output
For each test case, output an integer denoting the maximum xyz. If there no such integers, output −1 instead.
Sample Input
3 1 2 3
Sample Output
-1 -1 1
题意:找一组x,y,z,输出x*y*z最大值,且满足x+y+z=n x,y,z均能整除n
思路:
打表找规律
打表代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
//scanf("%d",&n);
for(int n=1;n<=100;n++){
int maxt=-1;
int a,b,c;
for(int x=1;x<=n;x++){
for(int y=1;y<=n-x;y++){
int z=n-x-y;
if(z&&n%x==0&&n%y==0&&n%z==0){
if(maxt<x*y*z){
a=x;
b=y;
c=z;
}maxt=max(maxt,x*y*z);
}
}
}
printf("%d:%5d %d %d %d\n",n,maxt,a,b,c);
if(n%12==0) printf("\n");
}
}
return 0;
}
正解代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
int judge(LL x){
return x%12==1||x%12==2||x%12==5||x%12==7
||x%12==10||x%12==11;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
LL n;
scanf("%lld",&n);
if(judge(n)) printf("-1\n");
else{
LL x,y,z;
if(n%3==0) x=y=z=n/3;
else{
x=n/2;
y=z=x/2;
}
printf("%lld\n",x*y*z);
}
}
return 0;
}