(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);
}