Yukari's Birthday
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的更多相关文章
- HDU4430 Yukari's Birthday(枚举+二分)
Yukari's Birthday HDU4430 就是枚举+二分: 注意处理怎样判断溢出...(因为题目只要10^12) 先前还以为要用到快速幂和等比数列的快速求和(但肯定会超__int64) 而 ...
- zoj 3665 Yukari's Birthday(枚举+二分)
Yukari's Birthday Time Limit: 2 Seconds Memory Limit: 32768 KB Today is Yukari's n-th birthday ...
- HDU 4430 & ZOJ 3665 Yukari's Birthday(二分法+枚举)
主题链接: HDU:pid=4430" target="_blank">http://acm.hdu.edu.cn/showproblem.php?pid=4430 ...
- Cogs 1995. Yukari
1995. Yukari ★★☆ 输入文件:camera.in 输出文件:camera.out 简单对比时间限制:1 s 内存限制:128 MB 题目背景: 幻想乡的创始人之一,八云紫 ...
- 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) ...
- 二分搜索 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.注意会爆 ...
- hdu 4430 Yukari's Birthday
思路: 分析知道1<=r<40:所以可以枚举r,之后再二分k. 代码如下: #include<iostream> #include<stdio.h> #includ ...
- HDU 4430 Yukari's Birthday(二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4430 题目大意:给定n个蜡烛,围绕蛋糕的中心插同心圆,从里往外分别是第1圈.第2圈....第r圈,第 ...
- HDU 4430 Yukari's Birthday (二分+枚举)
题意:给定一个n(18 ≤ n ≤ 10^12),一个等比数列k + k^2 + .......+ k^r = n 或者 = n-1,求出最小的k*r,如果最小的不唯一,则取r更小的 分析:两个未知数 ...
随机推荐
- 1/8=1/a+1/b,a,b为自然数
#include "stdio.h" int main(){ int a; int b; for(a=1;a<1000;a++) { for(b=1;b<1000; ...
- SDL 实现透明悬浮窗
最近一直想用SDL实现弹幕功能,但是一直没法实现悬浮窗和透明背景功能. 在一个老外的博客上发现了思路:EthioProgrammer: Applying transparency using win3 ...
- javascript操作json方法
/*新增json的对象属性*/ var json = {}; json["subjectName"] = "ddd"; json.teacherlist = & ...
- 使用ListView 时,遇到了 Your content must have a ListView whose id attribute is 'android.R.id.list' 错误
今天在开发Android小应用的时候,使用到了ListView,在使用自己创建的listview风格的时候,就出现了如标题的错误提示信息,这个就让我纳闷了,以前也不会出现这个问题啊,而且也可以运行,赶 ...
- HTML5 文件处理之FileAPI简介整理
在众多HTML5规范中,有一部分规范是跟文件处理有关的,在早期的浏览器技术中,处理小量字符串是js最擅长的处理之一.但文件处理,尤其是二进制文件处理,一直是个空白.在一些情况下,我们不得不通过Flas ...
- oracle批量导入数据
关键代码 OracleDataAdapter da=new OracleDataAdapter(); string sql_select = string.Format("select id ...
- iOS、mac开源项目及库汇总
原文地址:http://blog.csdn.net/qq_26359763/article/details/51076499 iOS每日一记------------之 中级完美大整理 iOS.m ...
- javascript基础学习(五)
javascript之函数 学习要点: 函数的介绍 函数的参数 函数的属性和方法 系统函数 一.函数的介绍 1.函数就是一段javascript代码.可以分为用户自定义函数和系统函数. 如果一个函 ...
- SGU 168.Matrix
时间限制:0.5s 空间限制:15M 题意: 给出一个N*M的矩阵A,计算矩阵B,满足B[i][j]=min{ A[x][y]:(y>=j) and ( x>=i+j-y )} Solut ...
- SGU 249.Matrix(Gray码)
题意: 用0到2^(n+m-1)这2^(n+m-1)个数填在一个2^n*2^m的矩阵里,使得所有相邻的数的二进制表示只有一位不同. Solution: Gray码.对于第i行第j列的数,由i的Gray ...