1.快速幂模板

前置知识

一个数字n,它的二进制位数一定是log2n向下取整+1;

快速幂模板代码

这段代码实现了快速幂算法(Exponentiation by squaring),用来计算 ( an ) 的值,其中 ( a ) 和 ( n ) 都是整数。

int quickpow(int a, int n)
{
int res = 1; // 初始化结果为1,因为任何数的0次幂都是1 while (n) { // 当指数n不为0时,继续执行循环
if (n & 1) // 如果n的最低位为1(即n是奇数)
res = res * a; // 将当前底数a乘到结果中
a = a * a; // 将底数a平方,相当于底数翻倍,指数减半
n >>= 1; // 将指数n右移一位,相当于将指数减半
} return res; // 返回计算结果
}

现在逐句解析每一行代码的作用:

  1. int res = 1;

    • 初始化变量 res 为1,这是最终结果的初始值。任何数的0次幂都是1。
  2. while (n) {

    • 进入一个循环,条件是当指数 n 不为0时继续执行。循环将持续执行直到 n 变为0。
  3. if (n & 1)

    • 判断当前的指数 n 是否为奇数,使用位运算 n & 1 来判断。如果 n 的最低位(即最右边的二进制位)为1,则说明 n 是奇数。
  4. res = res * a;

    • 如果 n 是奇数,则将当前的底数 a 乘到结果 res 中。这步实现了快速幂算法中的乘法操作。
  5. a = a * a;

    • 然后将底数 a 自乘,即 a 变成 a^2。这一步相当于将底数翻倍,对应于指数减半的操作。
  6. n >>= 1;

    • 将指数 n 右移一位,即 n 变成 n / 2。这一步实现了快速幂算法中的指数减半操作。
  7. 循环回到第2步,直到 n 变为0,退出循环。

  8. return res;

    • 返回最终计算得到的结果 res,即底数 a 的指数 n 次幂的值。

这段代码利用了快速幂算法的思想,通过迭代和位运算的方式,将指数的计算复杂度从 ( O(n) ) 优化到 ( O(log n) ),显著提高了计算效率。

快速幂算法的形象解释

快速幂算法的例题

【模板】快速幂

题目描述

给你三个整数 \(a,b,p\),求 \(a^b \bmod p\)。

输入格式

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

输出格式

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

样例 #1

样例输入 #1

2 10 9

样例输出 #1

2^10 mod 9=7

提示

样例解释

\(2^{10} = 1024\),\(1024 \bmod 9 = 7\)。

数据规模与约定

对于 \(100\%\) 的数据,保证 \(0\le a,b < 2^{31}\),\(a+b>0\),\(2 \leq p \lt 2^{31}\)。

答案

这题直接套用快速幂算法的模板,只需要每一步我们加上取模运算即可,注意数据需要开long long类型

#include<iostream>
using namespace std;
long long quickpow(long long a, long long n,long long p)
{
long long res = 1;
while (n) {
if (n & 1) res = (res * a)%p;
a = (a * a)%p;
n >>= 1;
}
return res;
}
int main()
{
long long a, b, p;
cin >> a >> b >> p;
printf("%lld^%lld mod %lld=%lld", a, b, p, quickpow(a, b, p));
return 0;
}

洛谷P1226 【模板】快速幂的更多相关文章

  1. 【洛谷】P1229快速幂

    题目链接:https://www.luogu.org/problemnew/show/P1226 题意:求b^p % m之后的结果 题解:快速幂模板 代码: #include<iostream& ...

  2. 洛谷.4717.[模板]快速沃尔什变换(FWT)

    题目链接 https://www.mina.moe/archives/7598 //285ms 3.53MB #include <cstdio> #include <cctype&g ...

  3. 洛谷 P1226 【模板】快速幂||取余运算

    题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...

  4. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  5. 洛谷 P1226 【模板】快速幂||取余运算 题解

    Analysis 快速幂模板,注意在最后输出时也要取模. 快速幂模板 inline ll ksm(ll x,ll y) { ll ans=; ) { ) { ans*=x; ans%=k; } x*= ...

  6. 洛谷P1226 【模板】快速幂||取余运算

    题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod k=s” s为运算结果 S1: ...

  7. 洛谷——P1226 取余运算||快速幂

    P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod ...

  8. 洛谷 P1226 取余运算||快速幂

    P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod ...

  9. 洛谷.3803.[模板]多项式乘法(FFT)

    题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...

  10. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

随机推荐

  1. redis简单应用demo - 订单号自增长的思路:业务编码+地区+自增数值

    redis简单应用demo1.字符串127.0.0.1:6379> set hello toneyOK127.0.0.1:6379> type hellostring127.0.0.1:6 ...

  2. 什么是浅拷贝和深拷贝,如何用 js 代码实现?

    〇.简介和对比 简介 浅拷贝:只复制原始对象的第一层属性值.   如果属性值是值类型,将直接复制值,本值和副本变更互不影响:   如果是引用数据类型,则复制内存地址,因此原始对象和新对象的属性指向相同 ...

  3. java基础-匿名类/对象

    最近有同事问我,以下这个语句是什么意思? MqMessge<MqMessgeThink> mm= JSON.parseObject(message.toString(),new TypeR ...

  4. 认真学习CSS3-问题收集-102号-关于定位

    css中有关于定位的一个属性position. 在w3cschool中,position的介绍如下: 值 描述 absolute 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定 ...

  5. Web运作原理探析

    Web运作原理探析 1.1 web的 概念 Web是一种分布式的应用架构,旨在共享分布在网络上的各个Web服务器中的所有互相链接的信息. 1.2 HTML是指超文本标记语言. 1.3 URL简介 UR ...

  6. Linux 内核:设备驱动模型(5)平台设备驱动

    Linux 内核:设备驱动模型(5)平台设备驱动 背景 我们已经大概熟悉了Linux Device Driver Model:知道了流程大概是怎么样的,为了加深对LDDM框架的理解,我们继续来看pla ...

  7. Linux 内核:设备驱动模型(1)sysfs与kobject基类

    Linux 内核:设备驱动模型(1)sysfs与kobject基类 背景 学习Linux 设备驱动模型时,对 kobject 不太理解.因此,学习了一下. 现在我知道了:kobj/kset是如何作为统 ...

  8. Android ADB命令集锦

    Android ADB命令集锦 原文(有删改):https://blog.csdn.net/dianziagen/article/details/57400723 本文包括: adb基本指令 Shel ...

  9. dig 命令详解及使用示例

    一.背景知识 CNAME CNAME 是 Canonical Name 的缩写,它是 DNS(域名系统)记录的一种类型.CNAME 记录用于将一个域名映射(别名)到另一个域名.换句话说,当你访问一个设 ...

  10. PromQL全方位解读:监控与性能分析的关键技术

    本文全面探索PromQL,从基础语法到高级操作,详细介绍了数据聚合.时间序列分析及内置函数应用,旨在提升用户构建复杂监控策略和性能分析的能力. 关注[TechLeadCloud],分享互联网架构.云服 ...