LuoguP1226 【模板】快速幂||取余运算
题目链接:https://www.luogu.org/problemnew/show/P1226
第一次学快速幂,将别人对快速幂原理的解释简要概括一下:
计算a^b时,直接乘的话计算次数为b,而快速幂则只需要log2(b)次,很实用。
快速幂有很多种解释,以下介绍两种:
一.
我们可以将b转换为二进制来看,比如计算2^11,因为(11)10=(1011)2,所以211=21*8+0*4+1*2+1*1=21×8×21×2×21×1。
具体计算可以参考代码:
int quickPower(int a, int b)//是求a的b次方
{
int ans = , base = a;//ans为答案,base为a^(2^n)
while(b > )//b是一个变化的二进制数,如果还没有用完
{
if(b & )//&是位运算,b&1表示b在二进制下最后一位是不是1,如果是:
ans *= base;//把ans乘上对应的a^(2^n) base *= base;//base自乘,由a^(2^n)变成a^(2^(n+1))
b >>= ;//位运算,b右移一位,如101变成10(把最右边的1移掉了),10010变成1001。现在b在二进制下最后一位是刚刚的倒数第二位。结合上面b & 1食用更佳
}
return ans;
}
一般会将快速幂与取余运算结合在一起,例如本题。取余运算有一些很好的性质:
(a+b) mod c = (a mod c + b mod c) mod c
(a*b) mod c =((a mod c)*(b mod c)) mod c
即在本题中求幂的过程中取余和求幂之后取余是一样的。另外,关于本题,有一个特殊情况,即k=1时,结果总为0,需要特判(最后一个测试点)。
本题的AC代码如下:
#include<cstdio>
using namespace std; long b,p,k,res=; void QuickPower(long bb,long pp,long kk){
long base=bb;
base%=kk;
while(pp){
if(pp&){
res*=base;
res%=kk;
}
base*=base;
base%=kk;
pp>>=;
}
} int main(){
scanf("%ld%ld%ld",&b,&p,&k);
if(k!=){
QuickPower(b,p,k);
printf("%ld^%ld mod %ld=%ld\n",b,p,k,res);
}
else
printf("%ld^%ld mod %ld=0\n",b,p,k);
return ;
}
二.关于快速幂的另一种理解方式:
对于a^b,若b为偶数,递归计算(a2)b/2;若b为奇数,则递归计算a*(a2)(b-1)/2。
LuoguP1226 【模板】快速幂||取余运算的更多相关文章
- 洛谷 P1226 【模板】快速幂||取余运算
题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...
- 洛谷P1226 【模板】快速幂||取余运算
题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod k=s” s为运算结果 S1: ...
- 洛谷 P1226 【模板】快速幂||取余运算 题解
Analysis 快速幂模板,注意在最后输出时也要取模. 快速幂模板 inline ll ksm(ll x,ll y) { ll ans=; ) { ) { ans*=x; ans%=k; } x*= ...
- [每日一题2020.06.15]P1226 【模板】快速幂取余运算
我是题目 快速幂就是快速求 \(a^b\)的一种算法 快速幂 思想 : 比如我要求 \(6^9\) 首先将幂转化为二进制形式 : \[6^9 = 6^{1001} \tag{1} \] 可以得到 : ...
- 【模板】快速幂&取余运算
输入\(b\),\(p\),\(k\)的值,求\(b^p mod k\)的值.其中\(b\),\(p\),\(k^2\)为长整型数. 1.普通做法 \(print\) \(pow(b,p)\)\(mo ...
- 【洛谷P1226 【模板】快速幂||取余运算】
题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod k=s” s为运算结果 作为初 ...
- (分治法 快速幂)P1226 【模板】快速幂||取余运算 洛谷
题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod k=s” s为运算结果 输入输 ...
- 题解 P1226 【【模板】快速幂||取余运算】
1.题目分析 原题 本题在于快速幂的使用,以及对long long的应用问题. 2.解题思路 快速幂 求幂常见用法: int pow(int a,int b) { int ans; for(int i ...
- 1226 快速幂 取余运算 洛谷luogu
还记得 前段时间学习二进制快速幂有多崩溃 当然这次方法略有不同 居然轻轻松松的 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整 ...
随机推荐
- mysql分区表之三:MySQL分区建索引[转]
介绍 mysql分区后每个分区成了独立的文件,虽然从逻辑上还是一张表其实已经分成了多张独立的表,从“information_schema.INNODB_SYS_TABLES”系统表可以看到每个分区都存 ...
- JAVA多线程创建与退出过程
Java多个线程,什么时候被创建,什么时候退出? java程序的入口是什么? java主线程main结束后,是否程序就结束了?C中的(windows,linux)main函数执行完,整个进程结束,其子 ...
- 1001 A+B Format (20 分)
1001 A+B Format (20 分) Calculate a+b and output the sum in standard format -- that is, the digits mu ...
- VMware仅主机模式访问外网
原文转载至:https://blog.csdn.net/eussi/article/details/79054622 保证VMware Network Adapter VMnet1是启用状态 将可以 ...
- Javascript框架
网易开源框架http://www.oschina.net/p/nej http://www.linuxeden.com/html/develop/20120716/127404.html 16 款最流 ...
- 用cmd导入oracle的.dmp文件和修改oracle管理员密码
1,首先创建用户 语法[创建用户]: create user 用户名 identified by 口令[即密码]: 例子:create user zhengxin identified by zhen ...
- 【Codeforces】CF 5 C Longest Regular Bracket Sequence(dp)
题目 传送门:QWQ 分析 洛谷题解里有一位大佬讲的很好. 就是先用栈预处理出可以匹配的左右括号在数组中设为1 其他为0 最后求一下最长连续1的数量. 代码 #include <bits/std ...
- 生产者消费者模型(Queue,JoinableQueue)
生产者消费者模型 主要是为解耦 借助队列来实现生产者消费者模型 栈:先进后出(First In Last Out 简称 FILO) 队列: 先进先出(First In First Out 简称 FIF ...
- django-查询按时间排序
Meta类实现 class News(models.Model): title = models.CharField(max_length=35) desc = models.CharField(ma ...
- Xeon Phi 编程备忘
▶ 闲鱼的 Xeon Phi 3120A 配办公室的新 Xeon 服务器,记录一下环境安装过程. ● 原本尝试搭 Ubuntu 服务器,参考[https://software.intel.com/en ...