奇怪的函数 (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.
奇怪的函数

 

你可能感兴趣的:(奇怪的函数 (codevs 3538/1696) 题解)