华为C++题目:输入N,M,求N+N^2+N^3+...+N^M的结果(取余1000000007),1<N<=65536,1<M<=100000,用快速幂算法解决。

题目:输入N,M,求N+N2+N3+…+N^M的结果(取余1000000007),1

输入格式:每行输入N M,直到N M均等于0时跳出
输出格式:每行输出对应的结果

解题思路:
要实现快速幂算法,我们需要理解几个数学上的关键点:

1、幂的拆分: 对于任意的整数a和b,可以将b表示为二进制数,然后通过a的幂的拆分来计算a的b次幂。例如,如果b的二进制表示为1010,则可以将a的b次幂拆分为(a2)2 * a^4。

2、模运算的性质: 当我们对某个数进行模运算时,该数的幂次在模运算下仍然是有效的。也就是说,(a^b) % c = ((a % c)^b) % c。

3、迭代乘法: 为了防止中间结果过大,我们可以在每一步幂运算后立即进行模运算,这样每一步的计算结果都会保持在整数范围内。

C++实现快速幂算法:

#include 
#include 
#include 

using namespace std;

const int MOD = 1000000007; // 取余的模数

// 快速幂算法函数
long long quickPower(long long base, long long exponent, long long mod) {
    long long result = 1; // 结果初始化为1
    while (exponent > 0) {
        // 如果当前指数为奇数,则将当前底数乘到结果中
        if (exponent % 2 == 1) {
            result = (result * base) % mod;
        }
        // 将底数平方,指数减半(向下取整)
        base = (base * base) % mod;
        exponent /= 2;
    }
    return result;
}

int main() {
    int N, M;
    cin >> N >> M;
    while (N != 0 && M != 0) {
        // 计算N的M次幂,并取余
        long long result = quickPower(N, M, MOD);
        cout << result << endl;
        cin >> N >> M;
    }
    return 0;
}

这段代码首先定义了模数MOD,然后实现了快速幂函数quickPower和等比数列求和函数geometricSum。快速幂函数接受底数base、指数exponent和模数mod,而等比数列求和函数接受首项firstTerm、公比ratio、项数numberOfTerms和模数mod。

程序的主函数部分读取输入的N和M,然后使用快速幂函数计算N的M次幂,并使用等比数列求和函数计算从N到N^M的和。最后,程序输出计算结果。

请注意,这段代码假设了输入的N和M都是非负整数,并且N的范围是1到65536,M的范围是1到100000。如果输入的值超出了这个范围,程序可能不会正常工作。在实际应用中,应该对输入进行验证以确保它们在允许的范围内。

你可能感兴趣的:(C++面试宝典,c++,算法,华为)