快速幂

    众所周知,用快速幂来计算加减乘除等问题,可以防止数据爆掉。

    来看一下公式:(a+b)%p=(a%p+b%p)%p;(后面之所以要再%p是因为防(a%p+b%p)数据过大)

                            (a*b)%p=[(a%p)*(b%p)]%p;

                            (a-b)%p={[(a%p)-(b%p)]+p}%p;

    下面我们来看第一种情况:(a+b)%p=(a%p+b%p)%p

int qsm(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b%2==1)
        {
            ans*=a;
        }
        a=a*a;
        b/=2;
    }
    return ans;
}

    好了,那现在是第二种情况:(a*b)%p=[(a%p)*(b%p)]%p;

int qsm(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b&1)//b&1意思是b%2=1
        {
            ans=ans*a%p;
        }
        a=a*a%p;
        b>>=2;//意思相当于b/=2;
    }
    return ans;
}

    第三种情况和第二种情况类似,这里不予解释,大家可以自我思考。

posted @ 2018-11-26 19:21  明霞  阅读(152)  评论(0编辑  收藏  举报