Problem - 4430

  题意是,给出蜡烛的数量,要求求出r和k,r是蜡烛的层数,k是每一层蜡烛数目的底数。

  开始的时候,没有看清题目,其实中间的那根蜡烛是可放可不放的。假设放置中间的那根蜡烛,就可以用等比数列求和公式S=(k^(r+1)-1)/(k-1),因为这个公式,对于固定的r,S(k)是单调递增的,然后可以发现,r的范围是相当的小的,最多不会大于40,然后就可以对于每一个r进行一次二分查找,找到k。但是,对于r==1的时候,用这个公式的是会爆龙龙的,而r==1的时候又是直接可以计算出来的,所以留到之后再算。另外,求的是r*k最小的结果,其实很容易发现,r是越大越好的,所以就从大到小枚举r进行二分查找。如果都没有找到可行解,r==1的时候就唯一解了,所以之前是不用搜索r==1的情况的。

代码如下:

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7. typedef long long LL;
  8.  
  9. const LL INF = 9000000000000000000ll;
  10.  
  11. LL cal(LL k, int r) {
  12. LL ret = 1ll;
  13. while (r > ) {
  14. if (r & ) ret *= k;
  15. k *= k;
  16. r >>= ;
  17. }
  18. return ret;
  19. }
  20.  
  21. LL find(LL x, int ep) {
  22. LL h = 2ll, t = (LL) pow((double) INF, 1.0 / ep), mk = -1ll;
  23. while (h <= t) {
  24. LL m = h + t >> , tmp = cal(m, ep) - ;
  25. if (tmp / (m - ) < x) h = m + ;
  26. else {
  27. t = m - ;
  28. if (tmp % (m - )) continue;
  29. if (tmp / (m - ) == x || tmp / (m - ) == x + ) mk = m;
  30. }
  31. }
  32. return mk;
  33. }
  34.  
  35. int main() {
  36. LL x;
  37. while (cin >> x) {
  38. LL a = -1ll, b;
  39. for (int i = ; i > ; i--) {
  40. b = find(x, i + );
  41. if (b > ) {
  42. a = i;
  43. break;
  44. }
  45. }
  46. if (~a) cout << a << ' ' << b << endl;
  47. else cout << << ' ' << x - << endl;
  48. }
  49. return ;
  50. }

  看题真的要仔细,构思以及敲这个代码的时间是相当少的,可是因为题意没有看清,额外增加了十来分钟的debug时间,感觉相当不值啊!

——written by Lyon

hdu 4430 Yukari's Birthday (简单数学 + 二分)的更多相关文章

  1. HDU 4430 Yukari's Birthday(二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4430 题目大意:给定n个蜡烛,围绕蛋糕的中心插同心圆,从里往外分别是第1圈.第2圈....第r圈,第 ...

  2. HDU 4430 Yukari's Birthday (二分+枚举)

    题意:给定一个n(18 ≤ n ≤ 10^12),一个等比数列k + k^2 + .......+ k^r = n 或者 = n-1,求出最小的k*r,如果最小的不唯一,则取r更小的 分析:两个未知数 ...

  3. HDU 4430 Yukari's Birthday (二分)

    题意:有 n 个蜡烛,让你插到蛋糕上,每一层要插 k^i个根,第0层可插可不插,插的层数是r,让 r * k 尽量小,再让 r 尽量小,求r 和 k. 析:首先先列出方程来,一个是不插的一个是插的,比 ...

  4. hdu 4430 Yukari's Birthday 枚举+二分

    注意会超long long 开i次根号方法,te=(ll)pow(n,1.0/i); Yukari's Birthday Time Limit: 12000/6000 MS (Java/Others) ...

  5. HDU - 4430 Yukari's Birthday(二分+枚举)

    题意:已知有n个蜡烛,过生日在蛋糕上摆蜡烛,将蜡烛围成同心圆,每圈个数为ki,蛋糕中心最多可摆一个蜡烛,求圈数r和看,条件为r*k尽可能小的情况下,r尽可能小. 分析:n最大为1012,k最少为2,假 ...

  6. hdu 4430 Yukari's Birthday

    思路: 分析知道1<=r<40:所以可以枚举r,之后再二分k. 代码如下: #include<iostream> #include<stdio.h> #includ ...

  7. HDU 5073 Galaxy (2014 Anshan D简单数学)

    HDU 5073 Galaxy (2014 Anshan D简单数学) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5073 Description G ...

  8. hdu 2200 Eddy's AC难题(简单数学。。)

    题意: N个人,每个人AC的题数都不一样. Eddy想从中选出一部分人(或者全部)分成两组.必须满足第一组中的最小AC数大于第二组中的最大AC数. 问共有多少种不同的选择方案. 思路: 简单数学.. ...

  9. 洛谷试炼场-简单数学问题-P1403 [AHOI2005]-因数

    洛谷试炼场-简单数学问题 P1403 [AHOI2005]约数研究 Description 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机"Samuel I ...

随机推荐

  1. checkbox的全选,取消全选,获得选中值

    <html> <head> <title>jq全选以及获得选中项的值</title> <meta charset="utf-8" ...

  2. 使用帝国备份王软件提示 Parse error: syntax error, unexpected end of file

    使用帝国备份王软件提示 Parse error: syntax error, unexpected end of file时, 可以尝试一下方法: 1.php.ini要把short_open_tag ...

  3. golang之常量

    1.  常量可以是全局常量,也可以是函数内部的局部常量.常量的值不可修改,常量表达式的值在编译期计算,而不是在运行期.存储在常量中的数据类型只可以是布尔型.数字型(整数型.浮点型和复数)和字符串型.当 ...

  4. Wireshark抓包常见问题解析(转)

    1. tcp out-of-order(tcp有问题) 解答: 1). 应该有很多原因.但是多半是网络拥塞,导致顺序包抵达时间不同,延时太长,或者包丢失,需要重新组合数据单元 因为他们可能是通过不同的 ...

  5. bzoj3522 Hotel

    Description 有一个树形结构的宾馆,n个房间,n-1条无向边,每条边的长度相同,任意两个房间可以相互到达.吉丽要给他的三个妹子各开(一个)房(间).三个妹子住的房间要互不相同(否则要打起来了 ...

  6. WPF自定义控件 依赖属性绑定

    控件cs文件 using System.ComponentModel; using System.Windows; using System.Windows.Controls; using Syste ...

  7. Validation异常:No validator could be found for constraint '.....' validating type 'java.lang.Integer'.

    javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'java ...

  8. rm: cannot remove `libtoolT’: No such file or directory

    安装源码包第一步./configure检测是否可编译时,检测出问题rm: cannot remove `libtoolT’: No such file or directory 解决方案:将confi ...

  9. Java面向对象----多态概念,对象上下转型

    概念:同一操作作用于某一类对象,可以有不同的解释,产生不同的执行结果 多态存在的三个必要条件 需要存在继承和实现关系 同样的 方法调用而执行不同操作,运行不同的代码(重写操作) 在运行时父类或者接口的 ...

  10. 巨蟒python全栈开发-第11阶段 ansible_project4

    1.主机的增删改查 2.初始化的增删改查 3.项目的增删改查