hdu4430:http://acm.hdu.edu.cn/showproblem.php?pid=4430

题意:题目的意思就是给你一个s,让你求k,r,其中k,r,满足:k^1+k^2+.....+k^r==s||s-1,并且k*r是最小的,如果有多种情况,r是最小的。

题解:一开始不知道怎么做,听别人说是二分。然后开始往二分上想。

思维过程:一开始就想着怎么二分,首先二分必须找到一个线性关系,找了半天也没有找到什么线性关系,所以不知道怎么二分,也不知道二分什么变量。想了很久,最后看到k*r最小,k是底数,r是指数,所以当r最大时候,k是最小的,同时k*r是最小的,因为k是指数增长的,,当r很大,k只要很小就可以达到s.当k==2的时候,r最多只要40就可以达到s。所以可以枚举r了,然后来找k。这样就慢慢想到,对于固定r,k越大,它的次方和也是随着增大的,所以线性关系出来了,可以二分k,k初始值是s||s-1,所以分两种情况来做,就可以了。不过,这里还要处理一些益处问题,在计算次方和的时候,如果底数大于1e7,其他的值也行,只要不小于1e6就直接跳出,不用计算。具体的,代码中有注释。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n;
long long k,ans1,lastr,lastk,l,mid,r;
bool judge(long long s,int num,long long flag){
long long ans=,temp=s;
if(s>)return true;//这里是特判,方式爆出long long 因为如果这个数>1e7的话,她的平方必然大于n(考虑n范围)
for(int i=;i<=num;i++){
ans+=temp;
temp*=s;
if(ans>=flag)return true;//这里也是防止溢出
}
return false;
}
bool judge2(long long s,int num){//判断这个数是不是要找的数
long long ans=,temp=s;
if(s>)return false;
for(int i=;i<=num;i++){
ans+=temp;
temp*=s;
if(ans>n)return false;
}
if(ans==n||ans==n-)return true;
return false;
}
int main(){ while(~scanf("%I64d",&n)){
ans1=n-;lastr=;lastk=n-;
for(int i=;i<=;i++){
l=,r=n;
while(l<r){//二分的结果是要么找到了==n的数,要么循环退出
mid=(l+r)/;
if(judge(mid,i,n))
r=mid;
else
l=mid+;
}
if(judge2(l,i)&&ans1>i*l){//检查是否是找到==n的那个数
ans1=i*l;
lastr=i;
lastk=l;
}
l=,r=n-;
while(l<r){//要么找到==n-1的数,要么退出循环
mid=(l+r)/;
if(judge(mid,i,n-))
r=mid;
else
l=mid+;
}
if(judge2(l,i)&&ans1>i*l){//同上
ans1=i*l;
lastr=i;
lastk=l;
}
}
printf("%I64d %I64d\n",lastr,lastk);
}
}

Yukari's Birthday的更多相关文章

  1. HDU4430 Yukari's Birthday(枚举+二分)

    Yukari's Birthday  HDU4430 就是枚举+二分: 注意处理怎样判断溢出...(因为题目只要10^12) 先前还以为要用到快速幂和等比数列的快速求和(但肯定会超__int64) 而 ...

  2. zoj 3665 Yukari's Birthday(枚举+二分)

    Yukari's Birthday Time Limit: 2 Seconds       Memory Limit: 32768 KB Today is Yukari's n-th birthday ...

  3. HDU 4430 &amp; ZOJ 3665 Yukari&#39;s Birthday(二分法+枚举)

    主题链接: HDU:pid=4430" target="_blank">http://acm.hdu.edu.cn/showproblem.php?pid=4430 ...

  4. Cogs 1995. Yukari

    1995. Yukari ★★☆   输入文件:camera.in   输出文件:camera.out   简单对比时间限制:1 s   内存限制:128 MB 题目背景: 幻想乡的创始人之一,八云紫 ...

  5. 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) ...

  6. 二分搜索 UVALive 6076 Yukari's Birthday (12长春K)

    题目传送门 题意:问使得sum (k^i) = n || n -1 (1 <= i <= r) 的min (r*k)组合的r和k  分析:r的最大不会超过40,枚举r,二分搜索k.注意会爆 ...

  7. hdu 4430 Yukari's Birthday

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

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

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

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

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

随机推荐

  1. Boost.Asio c++ 网络编程翻译(20)

    异步服务端 这个图表是相当复杂的:从Boost.Asio出来你能够看到4个箭头指向on_accept.on_read,on_write和on_check_ping. 着也就意味着你永远不知道哪个异步调 ...

  2. uboot中的mmc命令

    一:mmc的命令例如以下: 1:对mmc读操作 mmc read addr blk# cnt 2:对mmc写操作 mmc write addr blk# cnt 3:对mmc擦除操作 mmc eras ...

  3. Android 仿PhotoShop调色板应用(三) 主体界面绘制

    版权声明:本文为博主原创文章,未经博主允许不得转载. Android 仿PhotoShop调色板应用(三) 主体界面绘制    关于PhotoShop调色板应用的实现我总结了两个最核心的部分:   1 ...

  4. java取得整数部分 代码

    Pattern p1 = Pattern.compile("[0-9]*"); Matcher m1 = p1.matcher("100.0"); boolea ...

  5. Python建立socket并获取信息

    import socket, sys port = 80 host = "www.baidu.com" print "Creating socket..." s ...

  6. HTML5 Media事件

    Media 事件 由媒介(比如视频.图像和音频)触发的事件(适用于所有 HTML 元素,但常见于媒介元素中,比如 <audio>.<embed>.<img>.< ...

  7. Android Listview with different layout for each row

    http://stackoverflow.com/questions/4777272/android-listview-with-different-layout-for-each-row 其关键在重 ...

  8. eclipse中更改默认编码格式

    更改过程如下: (1)window->preferences->general->content Types, 选中java class file修改default encoding ...

  9. CentOS7下配置Openvpn 2.3.12

    1.下载安装包 #wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.09.tar.gz#wget http://swupdate. ...

  10. Cacti优化之spine轮询器

    由于效率的原因,在需要大量采集数据时,如果使用自带的cmd.php轮询器会比较慢,1分钟1次的采集频率可能无法完成轮询所有的被监控的机器,从而可能导致部分监控项目不出图或图形断断续续.为了解决效率问题 ...