奇怪的函数 (codevs 3538/1696) 题解
【题目描述】
给定n,使得x^x达到或超过n位数字的最小正整数x是多少?
【样例输入】
11
【样例输出】
10
【解题思路】
首先想到枚举,但是范围有点大,n<=2*10^9,果断用二分。其实这道题并不难,要用到一个求位数的公式trunc(t*(ln(t)/ln(10)))+1,初三自然是没学的,直接抄上公式,AC……,二分的时候注意一下退出的条件。(wikioi上1696和3538的题目不一样,但同一个程序都能AC,也不知道1696中的k是干嘛的……)
【代码实现】
1 var n:qword; 2 function js(t:longint):qword; 3 begin 4 if t=1 then 5 js:=1 6 else 7 js:=trunc(t*(ln(t)/ln(10)))+1; 8 end; 9 procedure ef(l,r:longint); 10 var m:longint; 11 begin 12 if l=r then//退出条件,如果l=m,js(m)>=n,就无法二分了,也不难证明这个即为答案。同理,m+1与r一个意思 13 begin 14 writeln(l); 15 exit; 16 end; 17 m:=(l+r)div 2; 18 if js(m)>=n then//比n大,往左走, 19 ef(l,m) 20 else 21 ef(m+1,r); 22 end; 23 begin 24 readln(n); 25 ef(1,2000000000); 26 end.