(File IO): input:block.in output:block.out
时间限制: 1000 ms 空间限制: 131072 KB 具体限制
Goto ProblemSet
题目描述
味味有一个
A
×
B
×
C
A×B×C
A×B×C 的长方体积木,积木是有
1
×
1
×
1
1×1×1
1×1×1 的小积木块组成的。我们设定这个长方体的高为
A
A
A,宽为
B
B
B,长为
C
C
C。(为方便起见,长方体的长不一定要比宽的数值大)。
现在味味在这个长方体中的的左上角挖去了一个
(
A
−
1
)
×
(
B
−
2
)
×
(
C
−
2
)
(A-1)×(B-2)×(C-2)
(A−1)×(B−2)×(C−2)的小长方体。并且告诉你被挖去长方体的体积为
n
n
n,即
n
=
(
A
−
1
)
×
(
B
−
2
)
×
(
C
−
2
)
n=(A-1)×(B-2)×(C-2)
n=(A−1)×(B−2)×(C−2)。现在问你,被挖去小长方体后,原有长方体积木中剩下的
1
×
1
×
1×1×
1×1×的小积木块最少和最多分别是多少个。也就是说,在告诉你n值的前提下,求
m
i
n
A
×
B
×
C
−
n
和
m
a
x
A
×
B
×
C
−
n
min{A×B×C-n}和max{A×B×C-n}
minA×B×C−n和maxA×B×C−n。
输入
输入文件名为
b
l
o
c
k
.
i
n
block.in
block.in。
输入共
1
1
1行,仅一个正整数
n
n
n。
输出
输出文件名为
b
l
o
c
k
.
o
u
t
block.out
block.out。
输出共
1
1
1行包含两个用空格隔开的正整数,依次表示最少剩余小积木块和最多剩余小积木块个数。
样例输入
【样例输入1】
4
【样例输入2】
7
样例输出
【样例输出1】
28 41
【样例输出2】
47 65
数据范围限制
对于
20
20
20%的数据
1
≤
n
≤
400
1 ≤n≤400
1≤n≤400
对于
50
50
50%的数据
1
≤
n
≤
1
0
6
1 ≤n≤10^6
1≤n≤106
对于
100
100
100%的数据
1
≤
n
≤
1
0
9
1 ≤ n≤10^9
1≤n≤109
提示
样例1说明:
4
=
(
2
−
1
)
×
(
4
−
2
)
×
(
4
−
2
)
4=(2-1)×(4-2)×(4-2)
4=(2−1)×(4−2)×(4−2) 最少剩余的小积木块为
2
×
4
×
4
−
4
=
28
2×4×4-4=28
2×4×4−4=28(此时
A
,
B
,
C
A,B,C
A,B,C值分别为
2
,
4
,
4
2,4,4
2,4,4)
$4=(5-1)×(3-2)×(3-2) $最多剩余的小积木块为
5
×
3
×
3
−
4
=
41
5×3×3-4=41
5×3×3−4=41(此时
A
,
B
,
C
A,B,C
A,B,C值分别为
5
,
3
,
3
5,3,3
5,3,3)
解题思路
较复杂的模拟,题目说什么就做什么。
代码
#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);
}