📜  门| GATE CS 1996 |问题2(1)

📅  最后修改于: 2023-12-03 15:12:35.340000             🧑  作者: Mango

Gate CS 1996 Question 2

本题目是1996年的计算机科学和工程入门Gate考试中的第二题。这道题目是关于使用快速幂的算法来解决一道数论题目。

题目描述

给定两个数字$a$和$n$,其中$a$是正整数,$n$是非负整数。请计算$a^n$并对$10^9+7$取余数。

输入格式

输入由两个整数组成,分别是$a$和$n$。

输出格式

输出应该是一个整数,该整数是$a^n$对$10^9+7$取余数的结果。

示例
示例输入
2 10
示例输出
1024
解题思路

要计算$a^n$对$10^9+7$取余,首先需要确定$a^n$的值。当$n$比较小时,可以采用暴力算法求解,但是当$n$很大时,时间复杂度就会很高。因此,一种更快速的方法是使用快速幂。

快速幂的算法如下:

def power(base, exponent):
    result = 1
    while exponent > 0:
        if exponent % 2 == 1:
            result = result * base
        exponent = exponent // 2
        base = base * base
    return result

上面这个算法可以实现$a^n$的快速计算,时间复杂度为$O(logn)$。

为了计算$a^n$对$10^9+7$取余数,可以在快速幂的算法中添加取模操作:

def power_mod(base, exponent, mod):
    result = 1
    while exponent > 0:
        if exponent % 2 == 1:
            result = (result * base) % mod
        exponent = exponent // 2
        base = (base * base) % mod
    return result

最终的解题思路就是使用快速幂算法求解$a^n$,并使用取模操作得出结果。

代码实现

以下是Python实现的代码:

def power_mod(base, exponent, mod):
    """
    Computes (base ^ exponent) mod mod using quick exponentiation.
    """
    result = 1
    while exponent > 0:
        if exponent % 2 == 1:
            result = (result * base) % mod
        exponent = exponent // 2
        base = (base * base) % mod
    return result

def main():
    a, n = map(int, input().split())
    result = power_mod(a, n, 10**9+7)
    print(result)

if __name__ == '__main__':
    main()
时间复杂度

使用快速幂算法求解$a^n$的时间复杂度为$O(logn)$,另加取模操作的时间复杂度为$O(1)$。因此,整个算法的时间复杂度为$O(logn)$。