洛谷P1226 【模板】快速幂||取余运算
题目描述
输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整型数。
输入输出格式
输入格式:
三个整数b,p,k.
输出格式:
输出“b^p mod k=s”
s为运算结果
S1:用快速幂快速的求出a^b
原理
(1)如果将 a 自乘一次,就会变成 a^2 。再把 a^2 自乘一次就会变成 a^4 。然后是 a^8…… 自乘 n 次的结果是 a^(2^n) 。
(2)a^x*a^y = a^(x+y)。
(3)将 b 转化为二进制观看一下:
举个栗子: a^11=a^(8+2+1)=a^8*a^2*a 11=8+2+1,转化为二进制就是1011,每个位上的一就代表1,2,4,8....的有或无
那么怎么判断有或无呢? 用“按位与”运算 &(按位与功能是参与运算的两数各对应的二进位相与。只要对应的两个二进位都为1时,结果位就为1,比如1001&101就是0001),让a&1,判断最后一位是否是1,如果是就乘
然后还要用到“>>”这个符号,它的作用是让整个二进制数右移一位,相当于除以二,比如1011右移就是0101,这样就可以循环的判断是否要*a^多少次方
总的来说,如果 b 在二进制上的某一位是 1,我们就把答案乘上对应的 a^(2^n)
来看代码实现:
#include<iostream>
using namespace std;
int main()
{
int a,b,ans=1;
cin>>a>>b;
int i=a;
while(b)//当b不等于0时,用来判断b是否已经分解完
{
if(b&1)//判断二进制最后一位是否为1
{
ans=ans*i;//如果为1就 *a^(2^n)
}
i=i*i;//i自乘
b>>=1;//b右移一位,回到上面继续判断最后一位
}
cout<<ans;
return 0;//华丽的return
}
S2 神奇的取余运算
虽然我们已经用快速幂快速的算出了a^b,但是取余的话如果这个数太大的话评测就会炸,所以不能用常规的思路
快速幂经常要结合取余运算。这里也讲一点。
取余运算有一些好用的性质,包括:
(A+B) mod b = (A mod b + B mod b) mod b (A+B)mod b=(Amodb+Bmodb) modb
(A×B) mod b = ((A mod b) × (B mod b)) mod b (A×B)mod b=((Amodb)×(Bmodb)) modb(证明略)
于是,我们可以在每一个while循环中都给ans取余,这样可以保证最后的答案是正确的
S3 有机的结合
AC代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long b,p,k,s=;
long long powmod(long long a,long long b1,long long c)
{
long long i=a;
while(b1)
{
if(b1&)
{
s=(s*i)%c;
}
i=(i*i)%c;
b1>>=;
}
return s%c;
}
int main()
{
cin>>b>>p>>k;
cout<<b<<"^"<<p<<" mod "<<k<<"="<<powmod(b,p,k);
return ;
}
结合S1S2的解释很容易理解
于是这道题就结束了
洛谷P1226 【模板】快速幂||取余运算的更多相关文章
- 洛谷 P1226 【模板】快速幂||取余运算
题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...
- LuoguP1226 【模板】快速幂||取余运算
题目链接:https://www.luogu.org/problemnew/show/P1226 第一次学快速幂,将别人对快速幂原理的解释简要概括一下: 计算a^b时,直接乘的话计算次数为b,而快速幂 ...
- 洛谷 P1226 【模板】快速幂||取余运算 题解
Analysis 快速幂模板,注意在最后输出时也要取模. 快速幂模板 inline ll ksm(ll x,ll y) { ll ans=; ) { ) { ans*=x; ans%=k; } x*= ...
- 【洛谷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为运算结果 输入输 ...
- [每日一题2020.06.15]P1226 【模板】快速幂取余运算
我是题目 快速幂就是快速求 \(a^b\)的一种算法 快速幂 思想 : 比如我要求 \(6^9\) 首先将幂转化为二进制形式 : \[6^9 = 6^{1001} \tag{1} \] 可以得到 : ...
- P1226 【模板】快速幂||取余运算
https://www.luogu.org/problemnew/show/P1226 模板题 直接上代码吧 #include<bits/stdc++.h> using namespace ...
- 1226 快速幂 取余运算 洛谷luogu
还记得 前段时间学习二进制快速幂有多崩溃 当然这次方法略有不同 居然轻轻松松的 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整 ...
- 题解 P1226 【【模板】快速幂||取余运算】
1.题目分析 原题 本题在于快速幂的使用,以及对long long的应用问题. 2.解题思路 快速幂 求幂常见用法: int pow(int a,int b) { int ans; for(int i ...
随机推荐
- CSS Grid 读书笔记
基本概念 MDN上的解释是这样的 CSS Grid Layout excels at dividing a page into major regions or defining the relati ...
- lambda函数
1.lambda函数是语法简短的匿名函数 2.lambda函数可以接受一个或多个参数 3.lambda函数只能有一个表达式 4.一般用于非重用的代码块 1)g = lambda x : x**2 g( ...
- 学习用Node.js和Elasticsearch构建搜索引擎(1):了解并运行Elasticsearch
1.学习Elasticsearch概述. 了解Elasticsearch是什么?能做什么?可以查一下elasticsearch.lucene等的相关介绍,另外也可以查查资料比较一下其它的搜索引擎sph ...
- 二十二:制作app的时候超出部分不能滑动
给需要滑动的区域写以下样式(父级是浏览器) position: absolute; left: 0; right: 0; bottom: 0; top: 0; overflow-x: hidden; ...
- 二次剩余从csdn
欧拉准则 模\(p\)意义下,\(a\)是二次剩余等价于\(a^{\frac{p-1}{2}}\equiv 1\),\(a\)不是二次剩余等价于\(a^{\frac{p-1}{2}}\equiv -1 ...
- c++入门之结构体初步
结构体实际上是一种数据结构的雏形,对结构体的灵活使用很多时候可以带来很多便利.下面给出一个关于结构体的程序: #include "iostream" # include " ...
- mybatis的mapper注入失败
因为处在两个不同的资源文件夹下: 导致classpath无法加载其中一些文件,所以修改为classpath*后顺利进行. <!-- 加载spring容器 --> <!-- neede ...
- 解决ImportError: cannot import name 'webdriver' from 'selenium' (C:\Users\Mr.Su\PycharmProjects\***\venv\selenium.py)
报错信息如下图所示: 解决方案:将项目根目录下的自己创建的selenium.py文件重命名.
- TortoiseGit push免输密码
(ฅ>ω<*ฅ) 噫又好了~ TortoiseGit push免输密码的方法 – 晨旭的博客~https://www.chenxublog.com/2016/03/04/tortoiseg ...
- PV、TPS、QPS计算公式(转)
英文解释: PV=page viewTPS=transactions per secondQPS=queries per secondRPS=requests per second RPS=并发数/平 ...