1. 程式人生 > >洛谷2759 奇怪的函數

洛谷2759 奇怪的函數

說話 通過 數據 可樂 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 奇怪的函數