acwing 875

acwing875

题目大意:快速幂模板题

Train of thought

此题如果采用暴力的做法时间复杂度为0(n*b);

n为样例的数目,b是幂
我们想要优化暴力的做法,首先样例的数量是没有办法改变的,用二进制的思路来进行思考幂,将幂转换成二进制数表示,可以优化时间复杂度到0(n*logb)
图解
其中还运用了取模运算规则如(a*b) % p = ((a %p) * (b %p)) % p

综上所述,代码如下所示

#include<iostream>
#include<utility>
using namespace std;
typedef long long ll;
#define fi(a,b) for(int i = a; i <= b; ++i)
#define fr(a,b) for(int i = a; i >= b; --i)
using pii = pair<int,int>;
ll quick(ll a, ll b,ll p)
{
   ll res = 1;
    while(b)
    {
        if(b & 1)//取出对应的位看是否是1
            res = res * a % p;
        a = a * a % p;//相应的数进行累乘,幂增加
        b >>= 1;//通过移位继续向后检验
    }
    return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
ll n;
cin >> n;
while(n--)
{
    ll a,b,c;
    cin >> a >> b >> c;
    cout << quick(a,b,c) << endl;
}
return 0;
}
posted @ 2021-09-13 18:44  Sun-Wind  阅读(35)  评论(0编辑  收藏  举报