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

 

你可能感兴趣的:(code)