O(1)快速乘,慢速乘,快速幂

快速乘

引自2009国家集训队论文:骆可强:《论程序底层优化的一些方法与技巧》 

代码://挺迷的,不知道为什么,好用就是了

ll fast_mult(ll a,ll b,ll mod)
{
    return (a*b-(ll)((long double)a/mod*b)*mod+mod)%mod;
}//ll为long long

快速幂

ll fpow(ll a,ll b,ll c)
{
    a%=c;
    ll ans=1;
    while(b)
    {
        if(b&1) ans=ans*a%c;
        a=a*a%c;
        b>>=1;
    }
    return ans%c;
}

压行快速幂

ll fpow(ll a,ll b,ll c)
{
    ll ans=a;
    for(b--;b>0;b>>=1,a*=a%c,a%=c)
    if(b&1) ans*=a%c,ans%=c;
    return ans%c;
}

慢速乘(快速加)

ll fmult(ll a,ll b,ll c)
{
    a%=c;
    ll ans=0;
    while(b)
    {
        if(b&1) ans=(ans+a)%c;
        a=(a+a)%c;
        b>>=1;
    }
    return ans%c;
}

 O(n)欧拉筛质数

int vis[maxn],prime[maxn];
void init(int n)
{
    int cnt=0;
    vis[0]=1;
    vis[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i]) prime[cnt++]=i;
        for(int j=0;j<cnt&&i*prime[j]<=n;j++)
        {
            vis[i*prime[j]]=1;
            if(i%prime[j]==0) break;
        }
    }
}

质数vis=0 prime从0下标开始

原文地址:https://www.cnblogs.com/YangKun-/p/12551236.html