HDU
来源:互联网 发布:手机日历软件 编辑:程序博客网 时间:2024/05/22 11:09
题目描述:
点击打开链接
题意你把一块蛋糕分成R圈,每圈上要放K^i(1<=i<=R)个蜡烛,蜡烛的总数等于N,蛋糕的中心还可以放一个蜡烛也可以不放要求使R*K最小的K,R组合多组答案优先输出R小的。N的范围是1e12,即使K最小为2最高也只能计算到40次方左右,所以R的范围其实很小,枚举R然后二分求解K,这个题有问题的地方就在于算K的过程中容易炸long long 而且用大数貌似还会T,所以这里就要多注意一下就好了。
AC代码:
#include<iostream>#include<time.h>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<stack>#include<queue>#include<vector>#include<set>#include<algorithm>using namespace std;const double PI=acos(-1);const int SIZE=50;const long long INF=0x3f3f3f3f3f3f3f3f;const int MAXM=2000;long long n;long long qpow(long long x,long long y){ long long res=1; while(y) { if (y&1) res=res*x; x=x*x; y=y>>1; } return res;}long long handle(long long R){ long long l=2,r=n; while(l<=r) { long long mid=(l+r)/2; long long sum=1; long long ans=0; for (long long i=1;i<=R;i++) { if (n/sum<mid) { ans=n+1; break; } sum=sum*mid; ans=ans+sum; } if (ans==n||ans==n-1) return mid; else if (ans<n-1) l=mid+1; else r=mid-1; //cout<<l<<' '<<r<<endl; } return 0;}int main(){ while(scanf("%lld",&n)!=EOF) { long long R=1; long long ansx=INF; long long ansR=INF; long long ans=INF; while(R<=50) { long long x=handle(R); //if (R==2) cout<<x<<endl; if (x!=0) { if (x*R<ans) {ansR=R; ansx=x; ans=x*R; } } R++; } printf("%lld %lld\n",ansR,ansx); } return 0;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- 图解设计模式
- Hive Runtime Error while processing row
- 第五个实验 串口中断实验
- ZooKeeper
- C# 将16进制的btye数组转换为字符串
- HDU
- 网络攻防——黛蛇蠕虫病毒
- odoo10普通视图添加自定义css和自定义js
- 自制人物卡片轮播组件,自动轮播,点击切换
- 解密长沙矿工挖矿软件抽水图文教程
- 读取txt,分类训练集和测试集
- CKG10-高性能高可用Yii2.0电商平台 仿京东商城 高级组件 MySQL LVS
- java的mvc模式
- 第十二周 项目(5)