洛谷2759 奇怪的函數
阿新 • • 發佈:2018-02-20
說話 通過 數據 可樂 pri d+ 是否 body 輸入格式
Problem 3. Lemon_Soda
【題目描述】
小可樂驚喜的發現一瓶汽水中了再來一瓶, 他去商店換汽水的時候, 店主 $Lemon$ 和 $Soda$ 打算耍耍他,出了一個難題,而且做不出來就不給汽水喝
這題說的是:
使得$x^x$達到或超過 $n$ 位數字的最小正整數 $x$ 是多少?
小可樂見了兩位妹子緊張的不敢說話,快請你幫幫他解決這個難題吧
【輸入格式】
一個正整數 n
【輸出格式】
使得$x^x$達到 n 位數字的最小正整數 $x$
【輸入樣例】
11
【輸出樣例】
10
【說明】
n<=2000000000
換底公式
$$\log_ab=\frac{\log_cb}{\log_ca}$$
明顯的,數學裸題。春節回來恢復狀態。
solution: 可以先觀察一下題目所給的式子。設$f(x)=x^x$,解不等式$f(x)>=10^n$.
考慮到數據範圍很大,直接枚舉什麽的都不行。不妨套用數學方法解決,數學做法常見套路就是兩邊取常用對數。
兩邊取常用對數:
$$\lg x^x\le\lg n$$
由冪的對數性質:
$$x\lg x\le\lg n$$
這時可以考慮枚舉$x$,明顯會TLE,考慮優化方案。
由對數函數的性質,常用對數是單調遞增函數,可以使用二分優化。
考慮到我們需要求以上不等式的最小整數解,即對解集的邊界條件上取整的答案。
不妨二分一個答案$mid$,判斷是否滿足$\left\lceil mid\lg mid\right\rceil\le n$即可,時間復雜度是$O(\log_22000000000)$,可以通過所有數據。
#include<cstdio> #include<cmath> using namespace std; int l=1,r=0x7fffffff; long long n; int main() { scanf("%lld",&n); while(l<r)//二分 { int mid=(l+r)>>1; double len=1.*mid*log10(mid)+1e-9+1.;//轉成double,套套式子,處理浮點誤差blahblahblah if(len>n)r=mid; else l=mid+1; } printf("%lld",l); return 0; }
代碼還是很短的。思維難度簡單。
(我能說數學剛剛及格的人都秒了這道題嗎?OI的數學題還是比較簡單的qwq)
洛谷2759 奇怪的函數