Problem 1 heart.pas/c/cpp(heart.in heart.out)
【背景】
一个美丽的夜晚,Bingo和他的MM坐在高高的N骨N堆旁看着天上稀稀拉拉的星星。Bingo对着MM说:“我们就像指数函数。你是底数,我是指数。不管你是大于一还是大于零小于一,我都可一让我们的幸福指数(不同于上面的指数)到正无穷。”MM说“你是底数,我是指数,我要顺着你改变”。Bingo一阵感动,但是,作为一个男人,Bingo怎么能委屈自己的MM呢。Bingo说:“不行,我会心疼你的。”MM说:“我也会心疼你啊”。…………
【题目描述】
为了不让Bingo和他的MM谁更心疼,也就是让他们一样心疼对方,给你一个数n,请你找出最小的整数x使得xx的位数大于等于n。
【输入】
一个数,n。
【输出】
一个数x,满足xx的位数大于等于n,x-1x-1的位数小于n。
【样例】
heart.in
11
heart.out
10
【数据规模】
n<=1,000,000,000,000,000,000。
思路:数据范围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函数。