一類 O(1) 算法的總結


這里要注意一下, 一部分 O(1) 算法是需要 \(O(n)\) 或者 \(O(\sqrt n)\) 預處理的...

1.

O(1) 求 1~n 的異或和:

inline int calc(R int n){int t=n&3;return t&1?(t/2^1):(t/2^n);}

2.

O(1) GCD:

zzq 大佬的 blog 里面有寫,我還搬下來做過板子...

某些 數據下會比帶 log 的算法高到不知道哪里去,然鵝隨機情況嘛...咳咳,我只能說,人家 O(1) 是要預處理的...

3.

O(1) 前綴 k 次和:

類似這么個式子: \(\sum_{i=0}^n i^k\) (雖說左邊界是 0 是 1 沒什么關系,畢竟 k 也不會等於 0 )

對於 k=1 : 原式= \((n+1)n\over 2\)

對於01314413 k=2 : 原式= \(n(n+1)(2n+1)\over 6\) 或者 \(n(n+{1\over 2})(n+1)\over 3\) 也挺好記的

對於 k=3 : 原式= \((n+1)^2n^2\over 4\) ,其實就是 k=1 的情況平方了一下...

4.

O(1) 逆元

需要 O(n) 預處理,詳情看這里唄,順便 O(n) 前綴積一下就是階乘逆元了

5.

O(1) 快速冪

一個大前提是快速冪的底數 x 固定,比如說是 2

這樣我們可以 \(O(\sqrt P)\) 預處理出 \(x^0,x^1,...,x^{\sqrt P -1} , x^{\sqrt P},x^{2 \sqrt P},...,x^{P}\)

然后我們就可以愉快地 O(1) 查詢了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM