Descripción del título
Weiwei tiene un volumen rectangular A × B × C, y los bloques están compuestos de 1 × 1 × 1 bloques pequeños. Establecemos la altura de este cuboide en A, el ancho en B y la longitud en C. (Por conveniencia, la longitud del cuboide no tiene que ser mayor que el ancho).
Ahora Weiwei ha cavado un pequeño cuboide (A-1) × (B-2) × (C-2) en la esquina superior izquierda de este cuboide. Y decirle que el volumen del cuboide que se extrajo es n, es decir, n = (A-1) × (B-2) × (C-2). Ahora le pregunto, después de extraer el cuboide pequeño, ¿cuáles son el número mínimo y máximo de pequeños bloques 1 × 1 × 1 que quedan en el volumen rectangular original? En otras palabras, con la premisa de decirle el valor de n, encuentre min {A × B × Cn} y max {A × B × Cn}.
De entrada
El archivo de entrada se llama block.in.
Ingrese un total de 1 línea, solo un entero positivo n.
Salida
El archivo de salida se llama block.out.
La línea de salida consta de dos enteros positivos separados por espacios, que a su vez representan el número mínimo de bloques pequeños restantes y el número máximo de bloques pequeños restantes.
Entrada de muestra
[Entrada de muestra 1]
4
[Entrada de muestra 2]
7
Salida de muestra
[Salida de muestra 1]
28 41
[Salida de muestra 2]
47 65
Limitación del rango de datos
Para el 100% de los datos 1 ≤ n ≤ 10 ^ 9
Pronto
Explicación de la muestra 1:
4 = (2-1) × (4-2) × (4-2) El bloque de construcción pequeño restante mínimo es 2 × 4 × 4-4 = 28 (en este caso, los valores de A, B y C son respectivamente Es 2,
4, 4) 4 = (5-1) × (3-2) × (3-2) Los bloques pequeños más restantes son 5 × 3 × 3-4 = 41 (en este momento A, B, C Los valores son 5, 3 y 3)
Análisis
De hecho, podemos encontrar c enumerando a y b, lo que puede salvar una dimensión. Solo agrega un poco de timbre.
Código en
#include<iostream>
#include<cstdio>
using namespace std;
long long n,mn=2147483647,mx,c;
int main()
{
freopen("block.in","r",stdin);
freopen("block.out","w",stdout);
cin>>n;
for(int a=1;a*a*a<=n;a++) //优化
{
if(n%a==0) //判断整除
{
for(int b=a;a*b*b<=n;b++)//优化
{
if(n/a%b==0)
{
c=n/a/b;//知道a,b就知道c
if(a*b*c==n)//所有情况
{
mn=min((a+1)*(b+2)*(c+2),mn);
mn=min((a+2)*(b+1)*(c+2),mn);
mn=min((a+2)*(b+2)*(c+1),mn);
mx=max((a+1)*(b+2)*(c+2),mx);
mx=max((a+2)*(b+1)*(c+2),mx);
mx=max((a+2)*(b+2)*(c+1),mx);
}
}
}
}
}
cout<<mn-n<<" "<<mx-n;
return 0;
}