OCAC暑期比赛第一场 N题 快速幂 题解

快速幂
【题目描述】
给你两个int范围内的整数 a 和 b ,请求出 a 的 b 次方的个位数字是多少。
比如,假设 a == 3, b == 5,那么 3 的 5 次方是 243 ,它对应的数位数字是 3。
【输入格式】
输入一行包含两个 int 范围内的整数 a 和 b (1<=a,b<2^31),它们之间以一个空格分隔。
【输出格式】
输出一行包含一个整数,用于表示 a 的 b 次方的个位数字。
【样例输入】
3 5
【样例输出】
3
【题目描述】
这道题目用传统的方法做需要 O(b) 的时间复杂度,而 b 可能达到 20亿 的数据范围,所以按照传统方法是不可行的。
但是我们可以用分治的思想,求 a 的 b 次方之前,先求 a 的 b/2 次方。这样我们只需要 O(log b) 的时间复杂度就可以求解问题了。
实现代码如下:

#include <bits/stdc++.h>
using namespace std;

int calc(int a, int b) {
    if (b == 0) return 1;
    if (b == 1) return a % 10;
    a %= 10;
    int tmp = calc(a, b/2);
    tmp = tmp * tmp % 10;
    if (b % 2) tmp = tmp * a % 10;
    return tmp;
}

int a, b;

int main() {
    cin >> a >> b;
    cout << calc(a, b) << endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ocac/p/11113468.html