codeforces163D
Large Refrigerator
给定一个长方体的体积V,求出这个长方体的最小表面积。
输入
第一行有一个整数t (1 ≤ t ≤ 500) — 测试数据的组数。
下面是t组测试数据。每一组表示一个整数V (2 ≤ V ≤ 1018),通过分解质因数的形式给出。
设V = p1a1p2a2... pkak,其中pi 是不同的素数,ai是正整指数。
第一行给出一个正整数k — V中不同的质因子的个数。下面k行每行两个数字:pi和ai,用空格隔开。每一个pi都是不同的。所有ai > 0。
输出
输出t 行,在第i行输出第i-组测试数据的答案,其中包含4个空格隔开的数:最小表面积S和对应的长宽高的长度a,b,c。如果有多个答案,输出任意。长宽高顺序没有规定。
样例
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的更多相关文章
随机推荐
- spring-data-redis 2.0 的使用
在使用Spring Boot2.x运行Redis时,发现百度不到顺手的文档,搞通后发现其实这个过程非常简单和简洁,觉得有必要拿出来分享一下. Spring Boot2.x 不再使用Jedis,换成了L ...
- 【Trie】Phone List
[题目链接]: https://loj.ac/problem/10049 [题意] 问是否存在一组公共前缀.如果存在输出“NO”,否则输出“YES” [题解] 首先建出Trie树来,然后开始记录所有的 ...
- shell习题第17题:检测磁盘
[题目要求] 写一个shell脚本,检测所有磁盘分区使用率和inode使用率并记录到以当天日期命名的日志文件里,当发现某个分区容量或者inode使用量大于85%时候,发邮件提醒 [核心要点] df d ...
- Prometheus Operator 自动发现和持久化
Prometheus Operator 自动发现和持久化 之前在 Prometheus Operator 下面自定义一个监控选项,以及自定义报警规则的使用.那么我们还能够直接使用前面课程中的自动发现功 ...
- SIP中的SDP offer/answer交换初探
1.引言 SDP的offer/answer模型本身独立与于利用它的高层协议.SIP是使用offer/answer模型的应用之一.RFC 3264 定义了offer/answer模型,但没有规定使用哪个 ...
- cmder 增强型命令行工具
下载 https://github.com/cmderdev/cmder/releases/download/1.3.13/cmder.zip Cmder加到右键菜单 https://www.jian ...
- canvas学习之初级运用
<html> <head> <meta charset=utf-8> <title>绘制简单图形</title> <style typ ...
- css的一些样式
input标签中的一些样式: <input type="text">:表示输入文本 <input type="password">:表示 ...
- .NET 使用事物调用存储过程
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...
- 06_Hive分桶机制及其作用
1.Clustered By 对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分. Hive也是针对某一列进行桶的组织.Hive采用对列值哈希,然后 ...