(纪中)2174. 积木(block)

(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) (A1)×(B2)×(C2)的小长方体。并且告诉你被挖去长方体的体积为 n n n,即 n = ( A − 1 ) × ( B − 2 ) × ( C − 2 ) n=(A-1)×(B-2)×(C-2) n=(A1)×(B2)×(C2)。现在问你,被挖去小长方体后,原有长方体积木中剩下的 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×CnmaxA×B×Cn


输入
输入文件名为 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 1n400
对于 50 50 50%的数据 1 ≤ n ≤ 1 0 6 1 ≤n≤10^6 1n106
对于 100 100 100%的数据 1 ≤ n ≤ 1 0 9 1 ≤ n≤10^9 1n109


提示
样例1说明:
4 = ( 2 − 1 ) × ( 4 − 2 ) × ( 4 − 2 ) 4=(2-1)×(4-2)×(4-2) 4=(21)×(42)×(42) 最少剩余的小积木块为 2 × 4 × 4 − 4 = 28 2×4×4-4=28 2×4×44=28(此时 A , B , C A,B,C ABC值分别为 2 , 4 , 4 2,4,4 244
$4=(5-1)×(3-2)×(3-2) $最多剩余的小积木块为 5 × 3 × 3 − 4 = 41 5×3×3-4=41 5×3×34=41(此时 A , B , C A,B,C ABC值分别为 5 , 3 , 3 5,3,3 533


解题思路
较复杂的模拟,题目说什么就做什么。


代码

#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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值