(File IO): input:block.in output:block.out
時間限制: 1000 ms 空間限制: 131072 KB 具體限制
Goto ProblemSet
題目描述
味味有一個 的長方體積木,積木是有 的小積木塊組成的。我們設定這個長方體的高爲,寬爲,長爲。(爲方便起見,長方體的長不一定要比寬的數值大)。
現在味味在這個長方體中的的左上角挖去了一個的小長方體。並且告訴你被挖去長方體的體積爲,即。現在問你,被挖去小長方體後,原有長方體積木中剩下的的小積木塊最少和最多分別是多少個。也就是說,在告訴你n值的前提下,求。
輸入
輸入文件名爲。
輸入共行,僅一個正整數。
輸出
輸出文件名爲。
輸出共行包含兩個用空格隔開的正整數,依次表示最少剩餘小積木塊和最多剩餘小積木塊個數。
樣例輸入
【樣例輸入1】
4
【樣例輸入2】
7
樣例輸出
【樣例輸出1】
28 41
【樣例輸出2】
47 65
數據範圍限制
對於%的數據
對於%的數據
對於%的數據
提示
樣例1說明:
最少剩餘的小積木塊爲(此時值分別爲)
$4=(5-1)×(3-2)×(3-2) $最多剩餘的小積木塊爲(此時值分別爲)
解題思路
較複雜的模擬,題目說什麼就做什麼。
代碼
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n;
long long maxn,a[10000],t,minn;
int main(){
freopen("block.in","r",stdin);
freopen("block.out","w",stdout);
scanf("%d",&n);
maxn=8*n+9;
for(int i=1;i<=sqrt(n);i++)
{
if(n%i==0)
{
t++;
a[t]=i;
}
if((n/i)!=i)
{
t++;
a[t]=n/i;
}
}
minn=2147483647;
for(int i=1;i<=t;i++)
{
for(int j=1;j<=t;j++)
{
if((a[i]*a[j]*(n/a[i]/a[j]))==n)
{
minn=min(((n/a[i]/a[j]+1)*(a[i]+2)*(a[j]+2)-n),minn);
}
}
}
printf("%d %d",minn,maxn);
}