O(n)求素数,求欧拉函数,求莫比乌斯函数,求对mod的逆元,各种求

原创 2015年07月08日 10:29:11

筛素数

void shai()
{
    no[1]=true;no[0]=true;
    for(int i=2;i<=r;i++)
    {
        if(!no[i])
            p[++p[0]]=i;
        int j=1,t=i*p[1];
        while(j<=p[0] && t<=r)
        {
            no[t]=true;
            if(i%p[j]==0) //每个数字都有最小质因子,这里往后的数都会被筛过的,break
                break;
            t=i*p[++j];
        }
    }
}

O(n)筛欧拉函数

void find()
{
    phi[1]=1;
    for(int i=2;i<=maxn-1;i++)
    {
        if(!is_prime[i]){prime[++cnt]=i,phi[i]=i-1;}
        int j=1,t=2*i;
        while(j<=cnt&&t<=maxn-1)
        {
            is_prime[t]=1;
            if(i%prime[j]==0)
            {                        //欧拉函数公式是phi[i]=i*(1-1/p1)*(1-1/p2)..
                phi[t]=phi[i]*prime[j];//质因子相同,只有i不同,且t=prime[j]*i,故作此
                break;
            }
            else phi[t]=phi[i]*(prime[j]-1);//质因子不一样,因为欧拉函数是积性函数,就是
            j++;t=prime[j]*i;     //=phi[i]*phi[j]
        }
    }
}

sqrt(n)求单个欧拉函数

long long phi(long long x)
{
    long long t=x,l=sqrt(x);
    for(long long i=2;i<=l;i++)
    if(x%i==0)
    {
        t=t/i*(i-1);   //欧拉函数公式,一定是先除再加
        while(x%i==0)
            x/=i;
    }
    if(x>1)     //对x大于sqrt(x)的质因子最多有1个
        t=t/x*(x-1);
    return t;
}

O(n)筛莫比乌斯函数

void shai()
{
    no[1]=1;mu[1]=1;
    for(int i=2;i<=maxl;i++)
    {
        if(!no[i])
            p[++p[0]]=i,mu[i]=-1;//只有1个质因数,所以为-1
        int j=1,t=p[1]*i;
        while(j<=p[0] && t<=maxl)
        {
            no[t]=1;
            if(i%p[j]==0)
            {
                mu[t]=0;//某质因数的指数不为1,根据定义=0
                break;
            }
            mu[t]=-mu[i];//根据定义,当x=p1*p2*..*pk,mu[x]=(-1)^k,
            t=p[++j]*i;  //这里多一个质因数,自然就多乘一个-1
        }
    }
}

O(n)求1到n对mod的逆元
转自http://blog.csdn.net/whyorwhnt/article/details/19169035

inv[i] = ( MOD - MOD / i ) * inv[MOD%i] % MOD

证明:

设t = MOD / i , k = MOD % i

则有 t * i + k == 0 % MOD

有 -t * i == k % MOD

两边同时除以ik得到

-t * inv[k] == inv[i] % MOD

inv[i] == -MOD / i * inv[MOD%i]

inv[i] == ( MOD - MOD / i) * inv[MOD%i]

证毕

适用于MOD是质数的情况,能够O(n)时间求出1~n对模MOD的逆元

inv[1]=1;
for(long long i=2;i<maxl && i<mod;i++)
    inv[i]=(mod-mod/i)*inv[mod%i]%mod;
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

莫比乌斯函数

在数论中的积性函数:对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数。若对于某积性函数 f(n) ,就算a, b不互质,也有...

欧拉函数o(n)求素数

欧拉函数的定义: E(N)= ( 区间[1,N-1] 中与 N 互质的整数个数).  对于 积性函数 F(X*Y),当且仅当 GCD(X,Y)= 1 时, F(X*Y) = F(X)* F(Y)  ...

O(N)的素数筛选法和欧拉函数

首先,在谈到素数筛选法时,先涉及几个小知识点. 1.一个数是否为质数的判定. 质数,只有1和其本身才是其约数,所以我们判定一个数是否为质数,只需要判定2~(N - 1)中是否存在其约数即可,此种方...

hdu 6090 Rikka with Graph [想法题]

hdu 6090 Rikka with Graph [想法题]

我上传了资源,为什么没有给我积分?

我上传了资源,为什么没有给我积分?
  • dylneil
  • dylneil
  • 2009年10月12日 15:55
  • 176

扩展欧几里得、求乘法逆元及其应用、中国剩余定理(互质版和非互质版)、欧拉函数、快速判素数模板

互质版: #include #include #include using namespace std; typedef __int64 int64; int64 a[15...

数论线性筛总结 (素数筛,欧拉函数筛,莫比乌斯函数筛,前n个数的约数个数筛)

数论线性筛总结 (素数筛,欧拉函数筛,莫比乌斯函数筛,约数个数筛)

BZOJ 2818 Gcd(gcd(x,y)为素数/欧拉函数/莫比乌斯反演)

题目链接: BZOJ 2818 Gcd 题意: x∈[1,N],y∈[1,N],gcd(x,y)=素数的有序对(x,y)的对数。x\in [1,N],y\in [1, N],gcd(x,y)=素...
  • Ramay7
  • Ramay7
  • 2016年06月04日 14:55
  • 627

数论模版-欧拉函数、莫比乌斯函数和素数

/*Author:WNJXYK*/ #include #include #include #include #include #include #include #include using name...
  • WNJXYK
  • WNJXYK
  • 2014年10月28日 12:00
  • 388

nyoj-Color the necklace(Ploya定理 + 欧拉函数 + 扩展欧几里得(求逆元))

Color the necklace 时间限制:2000 ms | 内存限制:65535 KB 难度:0 描述 As we all know, girls love necklaces, especi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:O(n)求素数,求欧拉函数,求莫比乌斯函数,求对mod的逆元,各种求
举报原因:
原因补充:

(最多只允许输入30个字)