快速幂:acwing 875. 快速幂

给定 n� 组 ai,bi,pi��,��,��,对于每组数据,求出 abiimodpi����mod�� 的值。

输入格式

第一行包含整数 n�。

接下来 n� 行,每行包含三个整数 ai,bi,pi��,��,��。

输出格式

对于每组数据,输出一个结果,表示 abiimodpi����mod�� 的值。

每个结果占一行。

数据范围

1≤n≤1000001≤�≤100000,
1≤ai,bi,pi≤2×1091≤��,��,��≤2×109

输入样例:
2
3 2 5
4 3 9
输出样例:
4
1
难度:简单
时/空限制:1.5s / 64MB
总通过数:49440
总尝试数:78073
来源:模板题
算法标签
#include
using namespace std;

typedef long long LL;

LL quickmi(LL base,LL mi,LL p)
{
    LL res=1;
    while(mi)
    {
        if(mi&1)    res=res*base%p;
        mi>>=1;
        base=base*base%p;
    }
    return res;
}

int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        LL a,b,p;
        scanf("%lld%lld%lld",&a,&b,&p);
        LL ans=quickmi(a,b,p);
        printf("%lld\n",ans);
    }
    return 0;
}

快速幂的思路如下:首先需要注意一件事情,每一次中间运算都要取模,主要是为了防止发生溢出错误。快速幂的运算步骤是,先判断指数是否是奇数,假设指数是奇数,我们把答案乘以当前的底数,答案初始值为1,这一步操作结束之后,我们把指数除以2,把底数平方,比如说最开始是4^5,我们先把答案更新为4,然后把指数5除以2变成2(向下取整),把底数4平方变成16,操作结束之后指数不是奇数,不需要更新答案,指数再次变为原来的一半,2变成1,底数平方,变成16^2,操作结束之后,指数1是奇数,把答案更新,乘以当前的底数16^2,变成4*16^2,指数除以2变成0,结束循环。返回答案,也就是快速幂的结果。

主要利用的是指数可以拆成若干乘式的乘积,我们每一次把指数除以2,只需要把底数平方即可。注意考虑指数是奇数的情况,程序整除会向下取整。

你可能感兴趣的:(算法竞赛,算法,数据结构)