解题报告 Number
?
1.??????? 題目
1. Number
題目描述:
本題題目描述超簡單,大家只需領會精神即可。
話說小豆豆找到了這樣的一道題(不知是數學題還是OI題):
給定一個正整數N,現在讓你求一個X,使得X^X(即x的x次冪)的位數大于等于N,X-1^(X-1)的位數小于N。
這題難住了小豆豆,好糾結呀好糾結!請你們這些無所不能的Oier來幫幫他吧!
【輸入】
一個數,n。
【輸出】
一個數x,滿足xx的位數大于等于n,x-1x-1的位數小于n。
?
【樣例】
Number.in
11
Number.out
10
【數據規模】
?n<=1,000,000,000,000,000,000。
【時間,內存限制】
?各個測試點 1s,64M。
?
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/archive/2011/08/11/2134962.html
總結
以上是生活随笔為你收集整理的解题报告 Number的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解题报告 Valentine‘s se
- 下一篇: CUDA在Debug下编译有错而Rele