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;
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Codeforces 314E Sereja and Squares

坐标轴上有n个点,第i个点的坐标为i。 现在将所有点两两配对,给每一对点中坐标较小的标上小写字母,较大的标上大写字母,字母不会是x。 如果给每一对点都看作对角顶点画正方形,而这些正方形不相交也不接...

Bzoj 2683: 简单题(CDQ分治)

2683: 简单题 Time Limit: 50 Sec Memory Limit: 20M. Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

莫比乌斯函数ACM

莫比乌斯入门请耐心往下看: OK.现在可以开始刷题了。 莫比乌斯反演   HDU 1695 GCD 从区间[1, b]和[1,d]中分别选一个x, y,使得gc...

Google Code Jam Round2 A,B题解

咦莫名奇妙就进Round3了。。本来打算混一件衣服就好的 A 给你一张地图。有^和.。分别表示4个方向和空。走到空格上如果原来有方向则方向不变继续运动。如果空格为起始位置则不动 要求改变某些箭头,使得...

浅谈一类积性函数的前缀和

笔者在刷题过程中遇到一些求积性函数前缀和的问题,其中有一类问题需要在低于线性时间复杂度的算法,今天就来浅析一下这类问题的求解方法,当作以后讲课使用的讲义。若之后有了新的研究,再来继续完善这篇文章。本文...

51nod 1244 莫比乌斯函数之和(积性函数前缀和)

关于积性函数前缀和的问题,可以关注糖老师的博客关于积性函数前缀和的问题,可以关注糖老师的博客 http://blog.csdn.net/skywalkert/article/details/5050...

莫比乌斯函数

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

程序员的八重境界

看到一篇有趣的文章The Eight Levels of Programmers。以前似乎看过不少这种程序员的多少个级别、境界,但这篇语言很风趣,而且分类比较细化,让人觉得挺合情合理、无法反驳的。绝大...
  • dc_726
  • dc_726
  • 2017-08-31 04:58
  • 22447

最近发现一个网上购物好网站淘福网www.taofucn.com,上淘宝皇冠店铺购物还有现金返还

淘福网www.taofucn.com商品琳琅满目,应有尽有,团购已经够便宜的了,还有返利,真实好实惠! 注册还送一元。  淘福社区http://bbs.taofucn.com人气挺旺的。

莫比乌斯函数,数论中的战斗机

莫比乌斯函数,数论函数,由德国数学家和天文学家莫比乌斯(August Ferdinand M&ouml;bius ,1790–1868)提出。梅滕斯(Mertens)首先使用μ(n)作为莫比乌斯函数的...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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