快速幂乘法

本次我们来讲述快速幂乘法

  • 快速幂乘法相对于普通的乘法有很大的时间复杂度优化,其原因是基于位运算的一种算法,空间复杂度能够减少到O( log N )级别。而普通的乘法,则是O( N ) 级别。

下面来看一下代码:

#include<iostream>
using namespace std;

typedef long long ll;
ll Quick_Multi(ll a, ll b);

int main()
{
    ll a, b;//a的b次幂
    cout << "请输入a的几次方(a^b)" << endl;
    cin >> a >> b;
    cout << Quick_Multi(a, b) << endl;
    return 0;
}

ll Quick_Multi(ll a, ll b)
{
    ll ans = 1;
    if (!a)//判断a是否为零,如若是0,返回0
        return a;
    while (b)
    {
        if (b & 1)//进行与一操作
            ans *= a;
        a *= a;
        b >>= 1;//b向右移以为
    }
    return ans;
}

代码解释

  • 首先来看一下快速幂的函数。该函数需要两个参数,a和b。a为底,b为次幂,所计算的结果为a^b。
  • 在该代码中,使用了位运算右移和与。如果对于位运算不熟悉,可以上网查询一下。
  • 基本思路:我们以a为底,b为次幂,那么我们把b拆分为二进制数。举个例子: 2^7= 128; 那么我们把3拆分成二进制数,为0011,那么我们便有了2^(0011)?,也就是化成为(2 ^ 4) * ( 2 ^ 2 ) *( 2 ^ 1 )的形式。
  • 这个拆分的方法类似于分治。利用这个方法,可以把算法复杂度从 O( n )级别降低到O( long n )级别。

在一般的思路中,好比方我们求 2^7,那么普通的乘法就是 2 * 2 * 2 * 2 * 2 * 2 * 2 求了七次,而是用快速幂乘法,那么也就有了(2 * 2 * 2 ) * ( 2 * 2 * 2 ) * 2 =( ( 2 * 2 * 2 ) ^ 2 ) * 2,另外一个角度去看,乘了3次乘法运算。也就是说,我们把需要乘七次的乘法降低到了成三次。这就是快速幂乘法的意义。

原文地址:https://www.cnblogs.com/Yunrui-blogs/p/11082202.html

时间: 2024-11-06 15:14:20

快速幂乘法的相关文章

hdu-4990 Reading comprehension(快速幂+乘法逆元)

题目链接: Reading comprehension Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) Problem Description Read the program below carefully then answer the question.#pragma comment(linker, "/STACK:1024000000,1024000000"

hdu 2604 Queuing(矩阵快速幂乘法)

Problem Description Queues and Priority Queues are data structures which are known to most computer scientists. The Queue occurs often in our daily life. There are many people lined up at the lunch time. Now we define that ‘f’ is short for female and

Happy 2004(快速幂+乘法逆元)

Happy 2004 问题描述 : Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your job is to determine S modulo 29 (the rest of the division of S by 29). Take X = 1 for an example. The positive integer divisors of 2

hdu-5690 All X(快速幂+乘法逆元)

题目链接: All X Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Problem Description F(x,m) 代表一个全是由数字x组成的m位数字.请计算,以下式子是否成立: F(x,m) mod k ≡ c Input 第一行一个整数T,表示T组数据.每组测试数据占一行,包含四个数字x,m,k,c 1≤x≤9 1≤m≤10^10 0≤c<k≤10,000 Ou

hdu 4686 Arc of Dream(矩阵快速幂乘法)

Problem Description An Arc of Dream is a curve defined by following function: where a0 = A0 ai = ai-1*AX+AY b0 = B0 bi = bi-1*BX+BY What is the value of AoD(N) modulo 1,000,000,007? Input There are multiple test cases. Process to the End of File. Eac

hdu 1575 Tr A(矩阵快速幂乘法优化算法)

Problem Description A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input 数据的第一行是一个T,表示有T组数据. 每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据.接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容. Output 对应每组数据,输出Tr(A^k)%9973. Sample Input 2 2 2 1 0 0 1 3 99999

HDU 5793 A Boring Question (找规律 : 快速幂+乘法逆元)

A Boring Question Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 865    Accepted Submission(s): 534 Problem Description There are an equation.∑0≤k1,k2,?km≤n∏1?j<m(kj+1kj)%1000000007=?We define

快速求斐波那契数列(矩阵乘法+快速幂)

斐波那契数列 给你一个n:f(n)=f(n-1)+f(n-2) 请求出 f(f(n)),由于结果很大请 对答案 mod 10^9+7; 1<=n<=10^100; 用矩阵乘法+快速幂求斐波那契数列是经典应用: 矩阵公式 C i j=C i k *C k j; 根据递推式 构造2*2矩阵: 原始矩阵 1 0 0 1 矩阵 2 1 1 1 0 原始矩阵与矩阵 2相乘达到转化状态效果: 对矩阵二进行快速幂 乘法:达到快速转化矩阵的效果: 即使达到快速转化状态:那么大的数据范围也很难求解: 高精?这有

矩阵乘法&amp;&amp;矩阵快速幂&amp;&amp;最基本的矩阵模型——斐波那契数列

矩阵,一个神奇又令人崩溃的东西,常常用来优化序列递推 在百度百科中,矩阵的定义: 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 ,最早来自于方程组的系数及常数所构成的方阵.这一概念由19世纪英国数学家凯利首先提出. 好,很高深对吧.那我们就更加直接地理解一下矩阵的实质:二维数组 好了这个SB都会,就不解释了 同二维数组一样,矩阵是一个'纵横排列的二维数据表格',它一般是一个n*m的二维数组,其中n*m表示它有n行m列 每一位上的数可以用下标i,j来表示,形如这样一个矩阵: