C++ 数论相关题目(快速幂)

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

输入格式
第一行包含整数 n

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

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

每个结果占一行。

数据范围
1≤n≤100000
,
1≤ai,bi,pi≤2×109
输入样例:
2
3 2 5
4 3 9
输出样例:
4
1
C++ 数论相关题目(快速幂)_第1张图片
时间复杂度logk
思路就是先预处理出来logk个上图中的数,然后将指数k分解为一堆2的指数的和,然后选择对应的预处理出来的数相乘即可。k转化为二进制的数,有1的地方就是对应的需要乘的数。
代码模板可以写的比较简洁。

#include 
#include 

using namespace std;

const int N = 100010;

// a^k % p
int qmi(int a, int k, int p)
{
    int res = 1;
    while(k)
    {
        if(k & 1)
            res = (long long)res * a % p;
        k >>= 1;
        a = (long long)a * a % p;
    }
    return res;
}

int main ()
{
    int n;
    cin >> n;
    while(n -- )
    {
        int a, k, p;
        cin >> a >> k >> p;
        cout << qmi(a, k, p) << endl;
    }
    
    return 0;
}

你可能感兴趣的:(算法笔记,数论,力扣,数论,c++,快速幂)