Large Refrigerator

CodeForces - 163D

给定一个长方体的体积V,求出这个长方体的最小表面积。

输入

第一行有一个整数t (1 ≤ t ≤ 500) — 测试数据的组数。

下面是t组测试数据。每一组表示一个整数V (2 ≤ V ≤ 1018),通过分解质因数的形式给出。

V = p1a1p2a2... pkak,其中pi 是不同的素数,ai是正整指数。

第一行给出一个正整数k — V中不同的质因子的个数。下面k行每行两个数字:piai,用空格隔开。每一个pi都是不同的。所有ai > 0。

输出

输出t 行,在第i行输出第i-组测试数据的答案,其中包含4个空格隔开的数:最小表面积S和对应的长宽高的长度abc。如果有多个答案,输出任意。长宽高顺序没有规定。

样例

输入
3
1
2 3
1
17 1
3
3 1
2 3
5 1
输出
24 2 2 2
70 1 1 17
148 4 6 5

注释

在第一个测试数据中体积V = 23 = 8,最小表面积可由三边相等的正方体构成。

在第二个测试数据中体积V = 17,该长方体只有一种构成方法。

sol:直接爆搜会T出屎,所以要剪枝,我就XJB剪了一下,先搜a再搜b,强制a<b<c,还有中间如果体积已经超出了就退出,然后就过了

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
const ll inf=0x7fffffffffffffffll;
int T,n,tot=;
struct Node
{
ll p,a;
inline bool operator<(const Node &tmp)const
{
return p<tmp.p;
}
}Num[N];
ll P[N],A[N],V,ans,aa,bb,cc;
inline ll Ksm(ll x,ll y)
{
ll Res=;
while(y)
{
if(y&) Res=1ll*Res*x; x=1ll*x*x; y>>=;
}
return Res;
}
inline bool Judge(ll a)
{
return (1ll*(sqrt(V/a)**a+V/a)<=ans);
}
inline void dfs(int Now,ll a);
inline void dfs1(int Now,ll a,ll b);
inline void dfs(int Now,ll a)
{
if(a*a*a>V) return;
if(Now==n+)
{
if(Judge(a)) dfs1(,a,);
return;
}
int i;
ll tmp=Ksm(P[Now],A[Now]);
for(i=A[Now];i>=;i--)
{
A[Now]-=i;
dfs(Now+,a*tmp);
A[Now]+=i;
tmp/=P[Now];
}
dfs(Now+,a);
}
inline void dfs1(int Now,ll a,ll b)
{
if(a*b*b>V) return;
if(Now==n+)
{
ll c=V/a/b,tmp; tmp=a*b+a*c+b*c;
if(tmp<ans)
{
ans=tmp; aa=a; bb=b; cc=c;
}
return;
}
int i;
ll tmp=Ksm(P[Now],A[Now]);
for(i=A[Now];i>=;i--)
{
A[Now]-=i;
dfs1(Now+,a,b*tmp);
A[Now]+=i;
tmp/=P[Now];
}
dfs1(Now+,a,b);
}
int main()
{
int i;
R(T);
while(T--)
{
V=; ans=inf; R(n); tot=;
for(i=;i<=n;i++)
{
R(Num[++tot].p); R(Num[tot].a); V*=Ksm(Num[tot].p,Num[tot].a);
}
sort(Num+,Num+tot+);
for(i=;i<=tot;i++) {P[i]=Num[i].p; A[i]=Num[i].a;}
dfs(,);
W(1ll*ans*); W(aa); W(bb); Wl(cc);
}
return ;
}
/*
Input
4
1
2 3
1
17 1
3
3 1
2 3
5 1
1
2 2
Output
24 2 2 2
70 1 1 17
148 4 6 5
16 2 2 1 input
3
4
208513 1
2 1
10753058401 1
223 1
4
17469877 1
1283 1
949261 1
47 1
4
313 1
2 1
1546412477693 1
1033 1
output
4493896846822714 446 208513 10753058401
35388330702870 60301 949261 17469877
5130996602278690 626 1033 1546412477693
*/

codeforces163D的更多相关文章

随机推荐

  1. codeforce E - Minimal Labels+hdu 4857

    两个题目的意思差不多 都是希望得出的拓扑序如果有多种 要求输出字典序小的情况 这里引用一个大佬的博客 关于为什么不能直接建图然后用小根堆解决这个问题(http://blog.csdn.net/rgno ...

  2. python 使用三种常用的工具包处理图片

    matplotlib,PIL(Pillow),Opencv三种常用的作图方式. 使用matplotlib画图,很棒,matplotlib 是python最著名的2D绘图库,它提供了一整套和matlab ...

  3. VMware永久key

    VMware永久KEY:5F29M-48312-8ZDF9-A8A5K-2AM0Z

  4. Django rest-framework框架-序列化

    序列化: 第一版: class RolesView(APIView): def get(self,request,*args,**kwargs): roles = models.Role.object ...

  5. [转载]torch参数:torch.backends.cudnn.benchmark的意义

    [转载]torch参数:torch.backends.cudnn.benchmark的意义 来源:https://zhuanlan.zhihu.com/p/73711222 完整版请看原文,这里只截取 ...

  6. SqlServer 附加数据库出错

    方法一 找到要添加数据库的.mdf文件,点击右键,选择属性 在属性页面点击安全,选择Authenticated Users,单击编辑 Authenticated Users权限中选择完全控制,点击确定 ...

  7. 使用cnpm淘宝镜像

    选装cnpm 1.说明:因为npm安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果npm的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事. 2.官方网址:http://npm.ta ...

  8. split分离特殊字符

    Invalid escape sequence (valid ones are  \b  \t  \n  \f  \r  \"  \'  \\ ) \b  \t  \n  \f  \r  \ ...

  9. Supervisor的使用

    版权声明:原创文章欢迎转载,不过要记得加出处哦 https://blog.csdn.net/wljk506/article/details/77146248 supervisord 是Linux/Un ...

  10. 安卓App自动升级

    procedure _InstallApk(Apk: string); var LFile: JFile; LIntent: JIntent; begin LFile := TJFile.JavaCl ...