zoukankan      html  css  js  c++  java
  • [学习笔记]线性筛

    素数

    欧拉筛法保证每个合数只会被其最小的素数筛掉,所以复杂度是线性的。

    我们还能用此方法,筛出其他一些积性函数的值。

    积性函数:若(a,b)=1,则f(ab)=f(a);	imes;f(b).

    int p[N],n,cnt;
    bool b[N];
    inline void prime(){
        b[0]=b[1]=true;
        for(int i=2;i<=n;++i){
            if(!b[i]) p[++cnt]=i;
            for(int j=1;j<=cnt&&i*p[j]<=n;++j){
                b[i*p[j]]=true;
                if(!(i%p[j])) break;
            }        
        }
    }

    每次p[j]|i时跳出循环能保证每个合数只会被其最小的素数筛掉,因为i$	imes$p[k](k>j)的最小素数为p[j]

    欧拉函数

    欧拉函数$phi(x)的定义:小于等于x的正整数中与x互质的数的个数。

    phi(x)=egin{cases}1&x=1\x-1&x;is;prime\
xprod_{i=1}^{k}(frac{p_{i}-1}{p_{i}})&x=p_1^{a_1}$	imes$p_2^{a_2}$	imesdots	imes$p_k^{a_k}\end{cases}

    证明:

    • 如果n为某一素数p,则phi(p)=p-1.
    • 如果n为某一素数p的幂次p^aphi(p^a)=(p-1);	imes;p^{a-1}.
    • 欧拉函数是积性函数,即当(a,b)=1f(ab)=f(a);	imes;f(b).
    • x=p_1^{a_1}$	imes$p_2^{a_2}$	imesdots	imes$p_k^{a_k},

      则phi(x)=prod_{i=1}^{k}(p_i-1);	imes;p_i^{a_i-1}=xprod_{i=1}^{k}frac{p_i-1}{p_i}.

    px最小的质数,x'=x/p,在线性筛中,x被筛p$	imes$x'掉。

    x';mod;p
ot=0时,phi(x)=p$	imes$x'	imes(frac{p-1}{p})prod_{i=1}^{k'}(frac{p_{i}-1}{p_{i}})=(p-1)	imesphi(x')

    x';mod;p=0时,phi(x)=p$	imes$x'	imesprod_{i=1}^{k'}(frac{p_{i}-1}{p_{i}})=p	imesphi(x')

    int p[N],phi[N],n,cnt;
    bool b[N];
    inline void prime(){
        b[0]=b[1]=true;phi[1]=1;
        for(int i=2;i<=n;++i){
            if(!b[i]){
                p[++cnt]=i;phi[i]=i-1;
            }
            for(int j=1;j<=cnt&&i*p[j]<=n;++j){
                b[i*p[j]]=true;
                if(!(i%p[j])){
                    phi[i*p[j]]=p[j]*phi[i];break;
                }
                phi[i*p[j]]=(p[j]-1)*phi[i];
            }        
        }
    }

    莫比乌斯函数

    莫比乌斯函数mu(x)的定义:

    mu(x)=egin{cases}1&x=1\
(-1)^{k}&x=p_{1}^{a_{1}}p_{2}^{a_{2}};dots;p_{k}^{a_{k}}(a_{i}=1)\
0&x=p_{1}^{a_{1}}p_{2}^{a_{2}};dots;p_{k}^{a_{k}}(max{a_{i}}>1)end{cases}

    显然当x是质数时,mu(x)=-1

    x不是质数时,px最小的质数,x'=x/p,在线性筛中,x被筛p$	imes$x'掉。

    x';mod;p
ot=0时,当mu(x')
ot=0时,显然a_{i}=1mu(x)=-mu(x')

                   当mu(x')=0时,mu(x)=0,即mu(x)=-mu(x')

    x';mod;p=0时,显然max{a_{i}}>1mu(x)=0

    int p[N],mu[N],n,cnt;
    bool b[N];
    inline void prime(){
        b[0]=b[1]=true;mu[1]=1;
        for(int i=2;i<=n;++i){
            if(!b[i]){
                p[++cnt]=i;mu[i]=-1;
            }
            for(int j=1;j<=cnt&&i*p[j]<=n;++j){
                b[i*p[j]]=true;
                if(!(i%p[j])){
                    mu[i*p[j]]=0;break;
                }
                mu[i*p[j]]=-mu[i];
            }        
        }
    }
  • 相关阅读:
    C#判断网络链接状态
    C# 创建临时文件(转帖)
    C# 很久以前几个常用类
    正则附表
    如何判断WebBrowser浏览器网页加载完成
    控件阴影
    C# 使用WM_COPYDATA传输数据(两个窗体间通信)
    C# 调用POST请求
    改变无边框窗体的尺寸大小和移动无边框窗体
    IT学习网站
  • 原文地址:https://www.cnblogs.com/AireenYe/p/5821028.html
Copyright © 2011-2022 走看看