1. 题目
1. Number
题目描述:
本题题目描述超简单,大家只需领会精神即可。
话说小豆豆找到了这样的一道题(不知是数学题还是OI题):
给定一个正整数N,现在让你求一个X,使得X^X(即x的x次幂)的位数大于等于N,X-1^(X-1)的位数小于N。
这题难住了小豆豆,好纠结呀好纠结!请你们这些无所不能的Oier来帮帮他吧!
【输入】
一个数,n。
【输出】
一个数x,满足xx的位数大于等于n,x-1x-1的位数小于n。
【样例】
Number.in
11
Number.out
10
【数据规模】
n<=1,000,000,000,000,000,000。
【时间,内存限制】
各个测试点 1s,64M。
2. 题目实质
找一个满足条件的数。(怎么我总爱说废话)
3. 算法
二分 + 一个常识性的结论。
首先,先说一下这个常识性的结论:
一个数的位数: trunc(lg(x))+1
由换底公式得: trunc(ln(x)/ln(10))+1;
再加上一个 ^x : trunc(x*(ln(x))/(ln(10)))+1
所以,就是这样。
看看数据范围,再加个二分——> AC 。
4. 注意事项
其实我很想知道这个题究竟恶心到了多少人。
5. 时空复杂度
O(log n)
虽然他的 n 的 0 很多,不过用二分一样可以过去。
6. 程序代码
SueMiller (pascal)
var mid,l,r,tmp,n:int64;
s:string; flag:boolean;
function calc(x:int64):int64;
begin
calc:=trunc(x*(ln(x)/ln(10)));
exit(calc);
end;
begin
assign(input,'Number.in'); reset(input);
assign(output,'Number.out'); rewrite(output);
readln(n);
l:=1; r:=maxlongint*100000000;
while l<=r do
begin
mid:=(l+r) div 2;
tmp:=calc(mid)+1; //函数中没有加一,这里加。
if tmp>=n then begin flag:=true; r:=mid-1 end
else begin flag:=false; l:=mid+1; end;
end;
if flag then writeln(mid) else writeln(mid+1);
close(input);
close(output);
end.