刷题日记3.19
1.埃氏筛法
解决:
找出所有小于等于n的质数问题。
思想:
任意一个数(大于1),它的倍数均不是质数。
核心代码:
vis[0]=vis[1]=true;//1表示不是质数,被筛掉
for(int i=2;i<=n;++i){
if(!vis[i])for(ll j=1ll * i * i; j<=n;j+=i)vis[j]=true;
}
复杂度:
O(n*log(logn)), 小于1e7可用,再大用欧拉筛法
欧拉筛法
欧拉筛法的核心思想是:每个合数只被它的最小质因数筛掉一次。通过这种方式,避免了埃氏筛法中合数被重复标记的问题,从而提高了效率。
1 | // 初始化 |
2.gcd和lcm
辗转相除法
求两个数的最大公因数gcd
c语言代码:
1 | int gcd(int a,int b){ |
tips:最小公倍数lcm即二者之积除以他们的最大公因数。
3.快速幂
把指数拆到底数中来
1 | ll qmi(ll a, ll b, ll c){ |
4.乘法逆元
在取模时可能会用到乘法逆元,用来求在mod意义下的同类数。在取模意义下除以一个数等于乘以这个数的乘法逆元。取模的这个数是质数时有费马小定理。费马小定理就是用来求这个数的乘法逆元的。
根据费马小定理有:
代码:
1 | ll inv(ll x){//利用费马小定理得出乘法逆元式子,快速幂快速求出其值 |
5.组合数
注意一个重要的性质:帕斯卡恒等式。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 dmw's blog!
评论