重点看代码注释

题目 2088: [蓝桥杯]快速幂

时间限制: 1Sec 内存限制: 128MB
题目描述
给定A, B, P,求(A^B) mod P。
输入
输入共一行。
第一行有三个数,N, M, P。
输出
输出共一行,表示所求。

共10组数据
对100%的数据,A, B为long long范围内的非负整数,P为int内的非负整数。

样例输入
2 5 3
样例输出
2


C++代码如下:

#include <iostream>
using namespace std;
typedef long long ll;//用宏定义:#define ll long long
int mod;//全局变量,省去传参。
ll Power(ll base,ll pow);
int main()
{ll n,m;cin >> n >> m;cin >> mod;//这句代码一定要写上,在某的博客上没有这句活的,这个文章后面会讲n %= mod;//重点//将n化简,降低时间复杂度//由取模运算可知底数都要取一次模 cout << Power(n,m);return 0;
}
ll Power(ll base,ll power){ll result = 1;while (power){if (power & 1){result = (result * base) % mod;//取模是因为最后幂次为1时,还要取模,不论奇数还是偶数,除以二的过程中都会为1。 }power >>= 1;base = (base * base) % mod;//每一次乘之后,都要取模 }return result;
}

用C语言写代码如下:

#include <stdio.h>
#define ll long long
int main()
{ll base,power;//快速幂的目的是解决大数字,所以防止溢出,直接用long longint mod;ll result = 1;//result是最后的余数,即所求的数scanf("%lld %lld %d",&base,&power,&mod);base %= mod;//将base化简,降低时间复杂度while (power){ //logn,极大的降低时间复杂度if (power % 2 == 1){ //如果power是奇数,最后还要算一次base%modresult = (result * base) % mod;}power >>= 1;//改为位运算,速度更快//相当于power/=2;base = (base * base) % mod;}printf("%lld\n",result);return 0;
}

分元宵(传送)

题目描述
毕竟是元宵节,晚上还是要吃几个元宵。 Etéreo 家可是个大家庭,元宵的数量,甚至是餐具的数量,都多的惊人。现在,爱数学的 Etéreo 又来问你有趣的数学题了,快来秒掉它! Etéreo 家里有 \varsigmaς 种元宵馅, \varthetaϑ 种元宵皮,每个元宵可以选择任意一种元宵馅和任意一种元宵皮。同时有 \varpiϖ 张桌子,每张桌子上放了 \varrhoϱ 只碗,每只碗能放一只元宵。每只碗都要装一只元宵。Etéreo 会告诉你 \varsigma, \vartheta, \varpi, \varrhoς,ϑ,ϖ,ϱ 的值,想请问你有多少种装元宵的方式。答案对 \LambdaΛ 取模。
两种方式被认为是不同的当且仅当至少有一只碗存在于两种方式的同一个位置但是里面有至少一个元宵不同。
两个元宵被认为是不同的当且仅当元宵馅不同或者元宵皮不同。
碗和桌子都是有编号的,但是你不能改变碗或桌子的编号。
你可以认为碗和桌子都是固定的,你只能改变元宵的种类和位置。

输入描述:
输入共一行,五个整数 \varsigma, \vartheta, \varpi, \varrho, \Lambdaς,ϑ,ϖ,ϱ,Λ ,意义同题目描述。
输出描述:
每行一个整数,表示答案。
备注:
0≤ς,ϑ≤10^18
0≤ϖ,ϱ≤10^6
1≤Λ≤1,000,000,007


问题分析:
已知有 A 种 元宵馅,B 种元宵皮;
所以 我们可以认为 有Q = A * B 种 元宵;
有 C 张桌子 每张桌子上有 D 个碗;
所以 我们可以认为 一共有W = C * D 种位置;
两种不同方式的鉴定 是 至少存在一个相同的位置 上面的 元宵 是不同的;
我们可以认为每个位置 都有Q种选择 所以最后的答案 应该是 Q^W 然后要取模,就用快速幂。

在学习C++中,我们用到cmath或者循环计算指数幂。
但cmath中pow效率没循环高,循环效率也不高,计算一个数字的n次幂,就需要循环n次,复杂度为O(n)。

注:在做一些联系现实世界的题时,往往要考虑数据取特殊值,与实际联系起来。
如:这一题,当元宵馅和元宵皮为0时,在代码中,运行结果与事实符合,为0;当桌子和碗为0时,在代码中,运行结果与事实不符合,为1;所以加了判断条件num2 == 0

C++代码如下:

#include <iostream>
#include <cmath>
using namespace std;
#define ll long longint main()
{ll a,b,c,d,e;scanf("%lld %lld %lld %lld %lld",&a,&b,&c,&d,&e);ll num1 = (a % e) * (b % e) % e;//相当于对a * b取模,也就是底数取模ll num2 = c * d;ll result = 1;//num1 %= e;//前面已经除过了,再出没意义//但有些题解上写的有,可能是习惯吧.if (num2 == 0){printf("0");//要结合实际(特殊)情况,当没桌子或碗时} else {while (num2){if (num2 & 1){result = (result * num1) % e;}num1 = (num1 * num1) % e;num2 >>= 1;}printf("%lld\n",result);}return 0;
}

总结:

1.快速幂

快速幂的目的是解决大数字,所以防止溢出,直接用long long。

快速幂的模板如下:

long long mod;//这里为全局变量
long long Quiet_Power(long long base,long long power)
{long long result = 1;//result即是所求的数base %= mod;//一定要写上,不然有些题过不了 //将base化简,降低时间复杂度,即为边乘边取模的过程实现之一。while (power){if (power & 1){ //此处等价于if(power%2==1)//属于位运算,速度更快result = (result * base) % mod;//也可以写成 result = result * base % mod}base = (base * base) % mod;power >>= 1; //此处等价于power=power/2 //属于位运算,速度更快} return result;
}

这就是快速幂。

用JAVA的代码如下:
思路:java中,没longlong类型,用大数处理

//调用BigInteger的两个方法的第一个加个括号,规范化!
import java.util.Scanner;
import java.math.BigInteger;
public class A {public static void main(String[] args) {Scanner sc = new Scanner(System.in);BigInteger base = sc.nextBigInteger();BigInteger power = sc.nextBigInteger();BigInteger mod = sc.nextBigInteger();BigInteger result = BigInteger.ONE;base = base.mod(mod);//思维不要苟安一偶//power > 0 || power != 0while (power.compareTo(BigInteger.ZERO) != 0){//power % 2 != 0 || power % 2 == 1 判断奇偶数if ((power.mod(BigInteger.TWO).compareTo(BigInteger.ONE) == 0))//注意:这里是判断奇偶数的,是取余mod,不是divide,之前就搞错了。{result = (result.multiply(base)).mod(mod);}base = (base.multiply(base)).mod(mod);power = power.divide(BigInteger.TWO);}System.out.println(result);sc.close();}
}

2.取模运算

“取模”运算的运算法则:

1. (a + b) % p = (a % p + b % p) % p

2. (a - b) % p = (a % p - b % p ) % p

3. (a * b) % p = (a % p * b % p) % p

重点了解第三个式子,可以得到多个因子连续的乘积取模的结果等于每个因子取模后的乘积再取模的结果。
**误区:**普通方法是用等号前面的,快速幂是边计算边取模。
在学习快速幂时,我理解为等号前面是自己计算时的过程,后面是计算机计算取模时的过程。

3.为啥在while之前,加上base %= mod

参考资料:
1.小白入门(但这篇文章有瑕疵,在我文章中已解决,总体可以,适合了解,不适合做题)勿喷,纯属个人看法。

2.了解位运算(传送)

3.分元宵更详解(传送)

4.BigInteger详解(常用方法基本都有,就是排版不行,有时间我写一期)

哎哎,别先着急传送啊,喜欢的

快速幂算法(理解快速幂只需两道题)相关推荐

  1. 只需两步快速获取微信小程序源码

    第一次在掘金这样高大上的社区写文章,忐忑地敲下我获取小程序源码过程中的经验分享. 最近在学习微信小程序开发,半个月学习下来,很想实战一下踩踩坑,于是就仿写了某个小程序的前端实现,过程一言难尽,差不多两 ...

  2. 如何快速对人像进行处理?只需使用ON1 Portrait AI即可轻松完成修饰。

    如何快速对人像进行处理?只需使用ON1 Portrait AI即可轻松完成修饰.ON1 Portrait AI 2021 Mac版可以自动查找照片中的每个面孔,并使它们看起来很棒.它分析每张脸,并为皮 ...

  3. 低代码如何快速构建APP框架,SuccAP只需一分钟

    当我们需要低代码搭建一个新的业务应用时就需要新建应用.一个应用往往对应一个完整的业务应用场景,用户能在应用内完成一系列相关的业务流程活动,如省级全流程冷链溯源系统.企业采购管理系统.人力资源系统-- ...

  4. 算法笔记(3)—— 快速 I/O 算法:快速输入算法、快速输出算法

    I/O(英语:Input/Output),即输入/输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出,在算法竞赛里面一般指的就是控制台(那个黑窗口)里面的输入与输出,平时我们或许并 ...

  5. win10开机未能正确启动_设置华硕电脑定时开机只需两步!

    目前ASUS大部分台式机和一体机都支持定时开机功能. 只需两步即可实现 1.开机按[F2]或者[DEL]键进入BIOS,依次进入[Advanced][APM],将[ERP]设置为[Disabled], ...

  6. 只需两步获取任何小程序源码

    这种方法,并不能反编译出所有的小程序源码,请自知! 具体的局限请看:qwerty472123大神的md文件 https://github.com/qwerty472123/wxappUnpacker ...

  7. (只需两步)让ChatGPT免费帮你制作出漂亮的PPT

    目录 第一步:生成 PPT 代码 第二步:将代码转化为 PPT 还在为制作PPT而烦恼吗? 让ChatGPT来帮您! 本篇文章介绍如何利用ChatGPT一键生成PPT文字和样式,省时省力又专业! (真 ...

  8. 只需两步获取任何微信小程序源码

    只需两步获取任何微信小程序源码 kedwan关注 12018.09.15 09:32:43字数 2,428阅读 3,946 转载自百家号作者:不忘初心lucy 第一次在掘金这样高大上的社区写文章,忐忑 ...

  9. yoyo跑_足球YOYO体测大揭秘 失去资格只需两次

    编辑同志: 近日看到<江淮晨报>上有关足球运动员冬训YOYO测试的报道,但是,我们不清楚到底何谓"YOYO测试"?请给予解答!谢谢! 合肥市第四十二中学李鸣李鸣: 你好 ...

最新文章

  1. Facebook如何运用机器学习进行亿级用户数据处理
  2. 第四章 Joomla!扩展开发:前端开发
  3. spring创建web项目_使用Spring WS创建合同优先的Web服务
  4. 带注释的控制器– Spring Web / Webflux和测试
  5. C++工作笔记-对结构体中位域的补坑说明
  6. php返回原界面,thinkphp实现登录后返回原界面
  7. 【Python3之内置函数】
  8. linux中的特殊文件权限
  9. BZOJ1251序列终结者——非旋转treap
  10. python编程常用英语单词_Python编程中的英语单词整数
  11. ubuntu 10.04下vmware tools安装和一些应用
  12. GTK、Qt和wxWidgets
  13. PPT2010学习笔记(共20讲)
  14. LOMO+XQDA(2015CVPR)
  15. html浅色_修改CSS样式实现网页灰色(没有颜色只有浅色黑白)的几个方法整理
  16. GCC 预处理的宏 (predefined macros)
  17. 小P的故事——神奇的换零钱 背包
  18. 用水浒传来学习OKR
  19. k8s-生产级别构建DeployMent
  20. vscode如何同时运行多个vue项目

热门文章

  1. HMS-广告服务(原生广告)
  2. 跟我这么学Binder就对了!
  3. 2013年7月我国网络不良与垃圾短信息分析报告
  4. 系统和分布式设计专题
  5. java如果智慧小区物业系统,基于ssm\springboot智慧小区物业管理平台实现
  6. PhotoView踩坑
  7. python开发工业机器人视觉系统_工业机器人为什么需要机器视觉!
  8. CALL和RET指令
  9. mysql刚开始的密码是什么意思_mysql的密码(mysql初始密码是什么)
  10. 汽车电子芯片用在哪些电子组件上?