素数筛快速幂
素数筛快速幂
素数筛
埃氏筛法—-求解n以内的素数个数
1 | int prime[MAXN]; //第i个素数的值 |
这种方法比较好理解,初始时,假设全部都是素数,当找到一个素数时,显然这个素数乘上另外一个数之后都是合数(注意上面的i*i , 比 i*2 要快点 ),把这些合数都筛掉,即算法名字的由来。
但仔细分析能发现,这种方法会造成重复筛除合数,影响效率。比如10,在i=2的时候,k=2*15筛了一次;在i=5,k=5*6 的时候又筛了一次。所以,也就有了快速线性筛法。
快速线性筛法
1 |
|
两者对比
由上述数据不难看出,快速线性筛法的效率基本比普通筛法求素数的效率高一倍,说明这的确是一种比较可靠的关于求素数优化的算法~!
参考:
https://blog.csdn.net/dinosoft/article/details/5829550
https://zhuanlan.zhihu.com/p/42609585
快速幂,快速乘
参考:https://blog.xehoth.cc/DurationPlan-modPow/#%E5%8D%81%E8%BF%9B%E5%88%B6%E5%BF%AB%E9%80%9F%E5%B9%82
快速乘
普通快速幂在面对大量数据或单个够大数据时效率很低,这个时候我们就需要十进制快速幂,而如果模数是 long long
以内的数,我们可以用快速幂思想 O(log n)O(log n) 完成快速乘,但我们其实可以 O(1)完成。
利用 long double
,而 long double
的精度其实只有 19 位,直接乘是不行的,我们可以先除再乘,这样就不会出现精度问题,而前面直接计算 a×b,再减去后面的部分,即使前面 a×b 爆负,它还会再爆一遍变为正的,保证了答案的正确。
1 | typedef long double ld; |
二进制快速幂
基本代码,都懂
1 | typedef long long ll; |
蜜汁优化版本(参考ext/numeric.h的power函数)
1 | inline long optimizedModPow(long a, long b) { |
十进制快速幂
说白了就是拆成十进制数
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GreenHatHGのBlog!
评论