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下标开始

posted @ 2020-03-23 11:47  L·S·D  阅读(466)  评论(0编辑  收藏  举报