这里要注意一下, 一部分 O(1) 算法是须要 \(O(n)\) 或者 \(O(\sqrt n)\) 预处理的...html
O(1) 求 1~n 的异或和:算法
inline int calc(R int n){int t=n&3;return t&1?(t/2^1):(t/2^n);}
O(1) GCD:spa
zzq 大佬的 blog 里面有写,我还搬下来作过板子...code
某些 数据下会比带 log 的算法高到不知道哪里去,然鹅随机状况嘛...咳咳,我只能说,人家 O(1) 是要预处理的...htm
O(1) 前缀 k 次和:blog
相似这么个式子: \(\sum_{i=0}^n i^k\) (虽然说左边界是 0 是 1 没什么关系,毕竟 k 也不会等于 0 )get
对于 k=1 : 原式= \((n+1)n\over 2\)io
对于01314413 k=2 : 原式= \(n(n+1)(2n+1)\over 6\) 或者 \(n(n+{1\over 2})(n+1)\over 3\) 也挺好记的class
对于 k=3 : 原式= \((n+1)^2n^2\over 4\) ,其实就是 k=1 的状况平方了一下...数据
O(1) 逆元
须要 O(n) 预处理,详情看这里呗,顺便 O(n) 前缀积一下就是阶乘逆元了
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) 查询了