404 页面不存在

线性素数筛

1 不管i是不是素数,它与素数的乘积一定不是素数,直接use =1;

2 如果use=0那么i是素数加入到ss表中,然后枚举素数表,执行操作1,如果i是合数,如果素数表中有它的质因数,则说明已经被质因数筛过了,直接break即可。

void pd()
{
    use[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(use[i]==0);
            a[++k]=i;
        for(int j=1;j<=k&&i*a[j]<=n;j++)
        {
            use[i*a[j]]=1;
            if(i%a[j]==0)
                break; 
        }
    }
    return ;
}

线性求欧拉函数

什么是欧拉函数,欧拉定理

欧拉函数性质

1:因为欧拉函数是积性函数,如果i与p互质则有 ph (i*p) =ph i *ph p i%p!=0

2:ph i*p=ph i* p i%p==0不论p是不是质数

这样就可以枚举出所有情况下的欧拉函数

边线性筛边算欧拉函数:

void get_phi()
{
    for(int i=1;i<=N-3;i++)
        phi[i]=i;
    use[1]=1;
    for(int i=2;i<=N-3;i++)
    {
        if(use[i]==0)
        {
            ss[++k]=i;
            phi[i]=i-1;
        }
        for(int j=1;j<=k&&i*ss[j]<=N-3;j++)
        {
            int temp=i*ss[j];
            use[temp]=1;
            if(i%ss[j]==0)//i是ss的倍数 
            {
                phi[temp]=phi[i]*ss[j];
                break;
            }
            else
            {
                phi[temp]=phi[i]*(ss[j]-1);
            }
        }    
    }
}

求单个的欧拉函数

inline long long phi(long long x) 
{
    long long s=x,i=2;
    for (;i*i<=x;i++) if (!(x%i)) {s=s/i*(i-1); for (;!(x%i);x/=i);}
    if (x>1) s=s/x*(x-1); return s;
}

 gcd

顺便贴一下gcd吧(虽然可以用__gcd(a,b)这个自带函数)

long long gcd(long long a,long long b)
{
    return b?gcd(b, a % b):a;
}

原文地址:https://www.cnblogs.com/cherrypill/p/12505490.html