首页 > 其他分享 >数学筛法

数学筛法

时间:2023-09-27 16:26:13浏览次数:44  
标签:约数 筛法 int void 筛求 init 数学 inline

有的时候怕忘记,写篇小博客记录一下。

线性筛素数

inline void init(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(!vis[i]) prime[++cnt]=i;
        for(int j=1;j<=cnt && i*prime[j];j++)
        {
            vis[i*prime[j]]=1;
            if(!(i%prime[j])) break;
        }
    }
    return;
}

线性筛求欧拉函数

inline void init(int n)
{
    memset(vis,0,sizeof(vis));
    phi[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i]) {prime[++cnt]=vis[i]=i,phi[i]=i-1;}
        for(int j=1;j<=cnt && i*prime[j]<=n;j++)
        {
            vis[i*prime[j]]=prime[j];
            phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]);
        }
    }
    for(int i=1;i<=n;i++) sum[i]=sum[i-1]+phi[i];
    return;
}

线性筛求莫比乌斯函数

inline void init(int n)
{
    mu[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i]) {mu[i]=-1;prime[++cnt]=i;}
        for(int j=1;j<=cnt && i*prime[j]<=n;j++)
        {
            vis[i*prime[j]]=1;
            if(!(i%prime[j])) {mu[i*prime[j]]=0;break;}
            else mu[i*prime[j]]=-mu[i];
        }
    }
    for(int i=1;i<=n;i++) sum[i]=sum[i-1]+mu[i];
    return;
}

线性筛求约数个数

用 \(d_i\) 表示 \(i\) 的约数个数,\(num_i\) 表示 \(i\) 的最小质因子出现次数。

inline void init(int n)
{
    d[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i]) 
        {
            prime[++cnt]=i;
            d[i]=2,num[i]=1;
        }
        for(int j=1;j<=cnt && i*prime[j]<=n;j++)
        {
            vis[i*prime[j]]=1;
            if(!(i%prime[j]))
            {
                num[i*prime[j]]=num[i]+1;
                d[i*prime[j]]=d[i]/num[i*prime[j]]*(num[i*prime[j]]+1);
                break;
            }
            else num[i*prime[j]]=1,d[i*prime[j]]=d[i]*2;
        }
    }
    return;
}

线性筛求约数和

用 \(s_i\) 表示 \(i\) 的约数和,\(g_i\) 表示 \(i\) 的最小质因子的 \(p^0+p^1+p^2+\dots +p^k\).

inline void init(int n)
{
    s[1]=g[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i]) vis[i]=1,prime[++cnt]=i,g[i]=i+1,s[i]=i+1;
        for(int j=1;j<=cnt && i*prime[j]<=n;j++)
        {
            vis[i*prime[j]]=1;
            if(!(i%prime[j]))
            {
                g[i*prime[j]]=g[i]*prime[j]+1;
                s[i*prime[j]]=s[i]/g[i]*g[i*prime[j]];
                break;
            }
            else
            {
                s[i*prime[j]]=s[i]*s[prime[j]];
                g[i*prime[j]]=prime[j]+1;
            }
        }
    }
    return;
}

标签:约数,筛法,int,void,筛求,init,数学,inline
From: https://www.cnblogs.com/code-ac/p/17732977.html

相关文章

  • 浅谈数学性质与数据结构
    交换律:当式子具有交换律时,我们可以考虑序列颠倒做两遍,算多了整体除二,强制钦定顺序等手段,优雅的解决这类问题。https://codeforces.com/contest/1635/problem/F 结合律:当发现维护的内容,存在结合律时,可以考虑线段树维护(需要支持信息快速结合),静态问题可以考虑猫树 重复消去......
  • 数学计算
    P4588[TJOI2018]数学计算考虑将所有\(1\)操作涉及到的数存入线段树中,初始为\(1\)。1操作:在某个位置修改为某个值。2操作:在某个位置修改为\(1\)。查询:查询所有数的乘积。无需懒标记,可以直接将所有操作数按照下标丢进去,也可以先提取出操作1(线段树的大小会小一些)。直接做......
  • 组合数学学习笔记
    这是一位数学小萌新看oi-wiki的一点点收获。二项式定理二项式定理是组合数学中很基础且很重要的定理,它的式子为:\((a+b)^n=\sum_{i=0}^n\binom{n}{i}a^ib^{n-i}\)可以通过归纳法剖析\((a+b)^n\)的过程证明其正确性。范德蒙德卷积:\(\large\sum_{i=0}^k\binom{n}{i}......
  • 《数学相关专题》小结
    CowslipCollections我们记\(f_i\)为\(gcd\)恰好为\(i\)的方案数。然后我们的答案就是\(\sum\limits_{i=1}^{1000000}i\timesf_i\)不过这个\(f_i\)显然是不好求的,我们记\(g_i\)为\(gcd\)为\(i\)的倍数的方案数。那么有\(g_i=\sum\limits_{i|j}f_j=C_{cnt[d]......
  • 前端 数学计算 big.js 使用
     解决0.1+0.2不等于0.3的问题 解决方法方法一,同时扩大倍数再除以相同的倍数 0.1+0.2//0.30000000000000004(0.1*10+0.2*10)/10//0.3方法二,第三方库bignumber.jsmath.jsbig.js big.js基础用法运算//运算//constplus=Big(0.1).p......
  • 2023年南京大学“飞迪计划”二次选拔考试题(数学)
    2023年南京大学“飞迪计划”二次选拔考试题(数学)Fiddie​【创作声明】本卷是观众投稿的回忆版,由Fiddie整理,转载请【您的文章推送开头的显眼地方用大字】注明来源:知乎Fiddie.请勿在您转载的文章背后插入过多的自己的广告!谢谢配合.如果同学们有类似的考试,欢迎回......
  • Competition Set - 数学相关
    CF645FLink&Submission.利用\(\sum\limits_{d|n}\varphi(\frac{n}{d})=n\),只要对每个数\(x\),求出\(cnt_x\)表示\(x\)的倍数数目,然后\(\sum\limits_{x}\varphi(x)C_{cnt_x}^k\)就是答案。每加入一个数进行修改,\(O(\sqrtn)\)枚举因数即可。CF724GLink&Submission.考......
  • math 库中常用的数学运算和常量【GO 基础】
    〇、关于mathGO语言的math库是一个内置的标准库,其中包含了许多数学函数和常量,用于计算各种数学运算和统计学计算。日常开发中,计算当然是少不了的,那么今天来梳理下备查。一、测试示例1.1小数位的:Round-四舍五入、RoundToEven-四舍/五至偶数funcRound(xfloat64)float6......
  • HNU个人项目中小学数学卷子自动生成程序互评
    一、简介本博客是对结对编程队友代码的分析与总结,代码使用语言为C++。完成情况:很好的实现了项目的需求,功能完整。同时每个页面的提示信息都比较完整,在不需要他人协助的情况下,可以根据屏幕上的提示信息进行操作,如果用户输入不正确,系统会出现指示,显示正确输入格式,用户可根据提示继......
  • 初中数学 - 无理数,以及各种数之间的关系
    无理数无限不循环小数,比如:π,它的小数部分无限长,但是并不循环。但是:1/3是有理数,他的小数部分无限长,但是是循环的。 数之间的关系  参考 有理数无理数实数的区别(baidu.com) ......