zoukankan      html  css  js  c++  java
  • 积性函数筛法

    积性函数筛法

    很多常用的数论函数都是积性函数,而在题目中,我们常常需要线性(甚至更高)的筛法。

    对于积性函数,我们可以在筛素数的基础上稍加修改,即可完成线性筛。

    首先,注意到积性函数的特点:

    [f(xy)=f(x) imes f(y) ]

    而可以线性筛的积性函数,需要知道以下两个式子的快速求法:

    [f(p)=?quad f(p^k)=?\pin prime ]

    其中, (f(p)) 大多是直接定义,(f(p^k)) 大多是递归定义。

    我们来回忆一下素数筛的过程:

    inp[0]=inp[1]=1;
    for(int i=2;i<=n;i++){
        if(!inp[i]){
            prime[++tot]=i;
        }
        for(int j=1;j<=tot && i*prime[j]<=n;j++){
            int tp=prime[j]*i;
            inp[tp]=1;
            if(i%prime[j]==0){
                break;
            }
        }
    }
    

    在线性筛素数的基础上,我们可以进行线性筛的修改。

    首先,对于判定的质数 (p) ,可以直接给出定义的值。

    之后,对于 (i\%p eq0) ,由于 (i)(p) 互质,可以直接用积性函数性质推得。

    然后,对于 (i\%p == 0) :

    • (i) 内的最小素因子是 (p) ,此刻可以将 (i) 内的素因子都除掉,然后就可以用积性函数的性质来递推了。为此,我们要记录一个最小质因子的幂次 (low_i)

      那么递推式就可以表示为:(f(i imes p)=f(i/low_i) imes f(low_i imes p))

    • 此处还有一个特殊的判定,当 (i==low_i) 时,上式相当于没推,所以我们要用 (f(p^k)) 的递推来计算。

    那么代码如下:

    inp[0]=inp[1]=1;
    f[1]=1;
    for(int i=2;i<=n;i++){
        if(!inp[i]){
            prime[++tot]=i;
            f[i]=对质数的定义式;
            low[i]=i;
        }
        for(int j=1;j<=tot && i*prime[j]<=n;j++){
            int tp=prime[j]*i;
            inp[tp]=1;
            if(i%prime[j]==0){
                if(i!=low[i])
                    f[tp]=f[i/low[i]]*f[low[i]*prime[j]];
                else
                    f[tp]=对p的次幂的定义式;
                low[tp]=low[i]*prime[j];
                break;
            }
            f[tp]=f[i]*f[prime[j]];
            low[tp]=prime[j];
        }
    }
    

    缺点很明显,比较耗空间。(但是题目会给够的

    当需要线性筛很多个积性函数时,可以同时进行。

    这种基于素数筛的线性筛法,有时不止对积性函数有用,对于一些和素数有关的函数也可以筛出,具体在我写的莫比乌斯反演中有例子。


    (frak by;thorn\_)

  • 相关阅读:
    npm tip: go to the package's home page
    centos7在Evolution中配置163邮箱,被阻止收件解决方法
    emacs-显示行号以及跳转到指定行
    2020年学习目标之一——emacs
    学习前端的时候,突然想起了Sharepoint母版页里的占位符,算知识的融会不?
    问题记录--jekyll serve 启动的时候如何指定80端口
    为什么总是无法访问VMware内的web服务?
    python开发目录合并小工具 PathMerge
    python计算文件的md5值
    python+selenium 简单尝试
  • 原文地址:https://www.cnblogs.com/thornblog/p/12358432.html
Copyright © 2011-2022 走看看