8.3 心疼

来源:互联网 发布:mongodb和mysql的区别 编辑:程序博客网 时间:2024/04/29 12:16

Problem  1  heart.pas/c/cpp(heart.in   heart.out)    

 【背景】

  一个美丽的夜晚,Bingo和他的MM坐在高高的NN堆旁看着天上稀稀拉拉的星星。Bingo对着MM说:“我们就像指数函数。你是底数,我是指数。不管你是大于一还是大于零小于一,我都可一让我们的幸福指数(不同于上面的指数)到正无穷。”MM说“你是底数,我是指数,我要顺着你改变”。Bingo一阵感动,但是,作为一个男人,Bingo怎么能委屈自己的MM呢。Bingo说:“不行,我会心疼你的。”MM说:“我也会心疼你啊”。…………

【题目描述】

  为了不让Bingo和他的MM谁更心疼,也就是让他们一样心疼对方,给你一个数n,请你找出最小的整数x使得xx位数大于等于n

【输入】

一个数,n

【输出】

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

【样例】

heart.in

11

heart.out

10

【数据规模】

 n<=1000000000000000000

思路:数据范围MS很吓人,其实利用ln就能搞定。因为lg(x)+1就是x的位数而lg(xx)=x*lg(x),利用二分查找答案,问题就迎刃而解了

程序:

var
  x,n,l,r,mid,a,ans:qword;
  i,j:longint;
begin assign(input,'Heart.in');
  assign(output,'Heart.out');
  reset(input);
  rewrite(output);
  readln(n);
  if n<8 then r:=8 else r:=n;
  while l<=r do
   begin
     mid:=(l+r)>>1;
     a:=trunc(ln(mid)/ln(10)*mid)+1;
     if a>=n then
      begin
        ans:=mid;
        r:=mid-1;
      end
     else l:=mid+1;
   end;
  writeln(ans);
  close(input);
  close(output);

end.

(真的很短)

反思:对于数字位数很变态的纯数学问题要考虑ln函数。