解题报告 Number

 

1.        题目

1. Number

题目描述:

本题题目描述超简单,大家只需领会精神即可。

话说小豆豆找到了这样的一道题(不知是数学题还是OI题):

给定一个正整数N,现在让你求一个X,使得X^X(xx次幂)的位数大于等于NX-1^(X-1)的位数小于N

这题难住了小豆豆,好纠结呀好纠结!请你们这些无所不能的Oier来帮帮他吧!

【输入】

一个数,n

【输出】

一个数x,满足xx的位数大于等于nx-1x-1的位数小于n

 

【样例】

Number.in

11

Number.out

10

【数据规模】

 n<=1000000000000000000

【时间,内存限制】

 各个测试点 1s64M

 

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.

原文地址:https://www.cnblogs.com/SueMiller/p/2134962.html