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

逆元的几种求法(扩展欧几里得,费马小定理或欧拉定理,特例,打表等)

乘法逆元 对于缩系中的元素,每个数a均有唯一的与之对应的乘法逆元x,使得ax≡1(mod n) 一个数有逆元的充分必要条件是gcd(a,n)=1,此时逆元唯一存在 逆元的含义:模n意义下,1个数a...
  • guhaiteng
  • guhaiteng
  • 2016年08月04日 22:24
  • 7459

Hdu 5514 类莫比乌斯函数 容斥原理

题意:有m个石子围成一圈, 有n只青蛙从跳石子, 都从0号石子开始, 每次越过a[i]个石子 问所有被至少踩过的石子的序号之和思路: 设所有踩到的石头下标集合为 P,题目求sum(P),青蛙集合为...
  • Techmonster
  • Techmonster
  • 2016年09月29日 17:59
  • 864

莫比乌斯函数详解

在讲这个函数之前。最好先了解欧拉函数。 我们用 \  记为整除。 记得小学的时候整除和整除以的概念么?别混淆。 2整除4 记作 2\4。 欧拉函数用来表示。 那么根据法里级数的展开(这个感觉和A...
  • qq_32126633
  • qq_32126633
  • 2017年07月28日 10:33
  • 327

MATLAB求解二元(多元)函数极值

matlab求解二元函数极值命令: 1、x=fminsearch(fun,x0)或x=fminunc(fun,x0)求极小值点x,初值选为x0 2、[x,fmin]=fminsearch(fun,...
  • cantjie
  • cantjie
  • 2017年04月22日 20:43
  • 1631

《C语言及程序设计》实践参考——求阶乘函数

返回:贺老师课程教学链接  项目要求【项目4-求阶乘函数】(1)请输出满足条件n=a!+b!+c!的所有三位数n,其中,a、b、c分别是n的百、十、个位数。要求用自定义函数实现求阶乘。int mai...
  • sxhelijian
  • sxhelijian
  • 2015年04月22日 11:03
  • 1993

Matlab遗传算法求函数最大值

主函数函数main.mglobal Bitlength%定义3个全局变量 global boundsbegin global boundsend boundsbegin=-2; boundsend=2...
  • sunqiande88
  • sunqiande88
  • 2016年10月13日 20:06
  • 2622

使用可变参数,实现函数,求函数参数的平均值和最大值

利用可变参数列表:可变参数列表是通过宏来实现的,这些宏定义在stdarg.h中。 值得注意的是:可变参数列表传参时,第一个传的参数的个数。 步骤: 1.定义一个va_list类型的变...
  • sherry_zhe
  • sherry_zhe
  • 2017年11月16日 14:12
  • 166

模拟退火求函数最值问题求解

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2899      题意:给出方程,其中,输入,求的最小值。 #include #inclu...
  • qq_18343569
  • qq_18343569
  • 2015年12月14日 20:35
  • 830

欧拉函数及其求法

欧拉函数:对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。例如euler(8)=4,因为1,3,5,7均和8互质。 Euler函数表达通式:euler(x)=x(1-1/p1)...
  • qq_27138357
  • qq_27138357
  • 2015年08月10日 15:47
  • 1934

用函数求最大公约数

(1)输入两个数,并求出其最大公约数 #include using namespace std; int gcd(int x,int y) { int max,min; int n; if(x...
  • fu_yunjian
  • fu_yunjian
  • 2016年08月05日 10:51
  • 1657
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:O(n)求素数,求欧拉函数,求莫比乌斯函数,求对mod的逆元,各种求
举报原因:
原因补充:

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