快速幂||取余运算

题目描述:

给你三个整数 a, b, p,求 a^b mod p。

输入格式

输入只有一行三个整数,分别代表 a, b, p 。

输出格式

输出一行一个字符串 a^b mod p=s,其中 a, b, p 分别为题目给定的值, s 为运算结果。

分析:

该题使用b个a相乘的暴力写法会超时,故需要使用快速幂

eg.2^10 = 4^5 = 4 * 4^4 = 4 * 16^2 = 4 * 256 = 1024

代码:

#include 
using namespace std;

long long a, b, p, cnt1, cnt2, ans = 1;

int main() {
    scanf("%lld %lld %lld", &a, &b, &p);
    cnt1 = a;
    cnt2 = b;
    while(cnt2 > 0) {
        //判断此时的指数是否为奇数
        //若为奇数,则先拿出一个底数
        if(cnt2 % 2)
            ans = (ans * cnt1) % p;
        cnt1 = (cnt1 * cnt1) % p;
        cnt2 /= 2;
    }
    printf("%lld^%lld mod %lld=%lld", a, b, p, ans);
    return 0;
}

样例:

输入:

2 10 9

输出:

2^10 mod 9=7

你可能感兴趣的:(算法,快速幂,c++)