P2759 奇怪的函式 題解

2022-02-14 15:59:10 字數 1327 閱讀 2707

csdn同步

原題鏈結

前置知識:

二分,對數。

簡要題意:

求 \(x^x\) 的位數超過或達到 \(n\) 位的最小的 \(x\).

\(n \leq 2 \times 10^9\).

首先,\(x^x\) 與 \(x\) 是正比例關係,具有單調性。樸素來說就是\(x^x\) 隨 \(x\) 增大而增大,主要因為 \(x>1\).(答案不可能是 \(1\) 啊)

具有單調性的函式可以進行二分答案。 可以用 \(\mathcal(\log n)\) 的時間(其實不到 \(\log\),因為 \(x^x\) 位數大於 \(n\) 答案應該比 \(n\) 小的多,但是資料範圍就乙個 \(n\),這樣分析也沒啥問題)。那麼如何驗證答案呢?

即已知 \(x\) 和 \(n\),如何判斷 \(x^x\) 的位數是否超過 \(n\)?

下面我們要說乙個函式,可以算出乙個數的位數。

假設要算 \(a\) 的位數,同時存在自然數 \(k\)使得 \(10^k \leq a < 10^\),則 \(a\) 是 \(k+1\) 位數。簡單來說,就是,在 \(10^3\) 和 \(10^4\) 之間除了 \(10^4\) 都是 \(4\) 位數,很顯然吧!

你會發現 \(\log_ 10^k = k , \log_ 10^ = k+1\),所以,\(\lfloor \log_ a \rfloor= k\) .

這樣你會發現,\(\lfloor \log_ a \rfloor + 1\) 就是 \(a\) 的位數了!

那麼驗證就是 \(\lfloor \log_ a \rfloor + 1 \geq n\) 則達到(超過),否則就沒有達到。這樣的驗證是 \(\mathcal(1)\) 的。

時間複雜度:\(\mathcal(\log n)\).

實際得分:\(100pts\).

#pragma gcc optimize(2)

#includeusing namespace std;

inline int read()

int x=0; while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar(); return x*f;}

inline void write(int x)

if(x<10)

write(x/10);putchar(char(x%10+'0'));

}int main() printf("%d\n",r);

return 0;

}

洛谷P2759 奇怪的函式

使得 x x 達到或超過 n 位數字的最小正整數 x 是多少?輸入格式 乙個正整數 n 輸出格式 使得 x x 達到 n 位數字的最小正整數 x 輸入樣例 1 11輸出樣例 1 10n 2000000000 換底公式 相當於解不等式x x 10 n 1 兩邊取常用對數 x log10 x n 1 左...

洛谷P2759 奇怪的函式 log 二分

使得 x 達到或超過 n 位數字的最小正整數 x 是多少?輸入格式 乙個正整數 n 輸出格式 使得 x 達到 n 位數字的最小正整數 x 輸入樣例 1 複製11 輸出樣例 1 複製10 n 2000000000 比較套路,首先轉化一下題面,我們需要找到乙個最小的 x 使得 x x 10 n 兩邊同時...

LuoguP2759 奇怪的函式

使得 x x 達到或超過 n 位數字的最小正整數 x 是多少?這道題並沒有想出來,太丟臉了 首先注意到題目要求位數超過n位數字 考慮如何求位數,我們發現對於數n的位數就是log10 n 1 換到這道題裡就是求log10 x x 1 n的最小值的x 於是就是x log10 x 1 n的最小x值,二分即...