洛谷 P1226 【模板】快速幂||取余运算
洛谷 P1226 【模板】快速幂||取余运算
题目链接
https://www.luogu.org/problemnew/show/P1226
题目描述
输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整型数。
输入输出格式
输入格式:
三个整数b,p,k.
输出格式:
输出“b^p mod k=s”
s为运算结果
输入输出样例
输入样例#1:
2 10 9
输出样例#1:
2^10 mod 9=7
这道题有各种各样的做法,来整理一下几种思路吧
做法1(来自一本通)
思路
1.本题主要的难点在于数据规模很大(b,p都是长整型数),对于\(b^p\)显然不能死算,那样的话时间复杂度和编程复杂度都很大。
2.下面先介绍一个原理:A*B%K = (A%K )*(B% K )%K。显然有了这个原理,就可以把较大的幂分解成较小的,因而免去高精度计算等复杂过程。那么怎样分解最有效呢?
3.显然对于任何一个自然数P,有P=2 * P/2 + P%2,如19=2 * 19/2 + 19%2=2*9+1,利用上述原理就可以把B的19次方除以K的余数转换为求B的9次方除以K的余数,即B19=B2*9+1=B*B9*B9,再进一步分解下去就不难求得整个问题的解。
(额外提一点,最后输出的时候也不要忘记再取模一下,因为没取模我WA了一个点)
代码
#include<bits/stdc++.h>
using namespace std;
long long b,p,k,a;
long long f(long long p){
if(p==0)return 1;
long long tmp=f(p/2)%k;
tmp=(tmp*tmp)%k;
if(p%2==1)tmp=(tmp*b)%k;
return tmp;
}
int main(){
scanf("%lld%lld%lld",&b,&p,&k);
long long tmpb=b;
b%=k;
printf("%lld^%lld mod %lld=%lld\n",tmpb,p,k,f(p)%k);
return 0;
}
做法二
思路
首先要知道,余数是有规律的,除以任何数都是这样
拿样例来说吧,
b=2,p=10,k=9
2^1=2 2%9=2
2^2=4 4%9=4
2^3=8 8%9=8
2^4=16 16%9=7
2^5=32 32%9=5
2^6=64 64%9=1
2^7=128 128%9=2
我们会发现,余数到27的时候就已经跟21重复了 每一个数都是一样的
将重复的次数算出,最后在重算一次,就可以找到答案
注意:
1.不能用数组存余数,空间承受不起
2.一边乘一边除,否则会死得很惨
代码
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
long long b,p,k,s,t;
int main()
{
cin>>b>>p>>k;
cout<<b<<"^"<<p<<" mod "<<k<<"=";
s=b%k;
t=1;
for (int i=2;i<=p;i++)
{
s=s*b%k;
if (s==b%k) break;
t++;
}
p=p%t;s=1;
if (p==0) p=t;
for (int i=1;i<=p;i++)
s=s*b%k;
cout<<s;
return 0;
}
(来自洛谷)
做法三
思路
直接使用常规的快速幂算法
所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余)。在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快、计算范围更大的算法,产生了快速幂取模算法。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int power(int b,int p,int k);
int b,p,k;
signed main() {
cin>>b>>p>>k;
int www=p;
cout<<b<<"^"<<www<<" mod "<<k<<"="<<power(b,p,k)%k;
}
int power(int b,int p,int k) {
int ans=1;
b%=k;
while(p) {
if(p&1)
ans=(ans*b)%k;
p>>=1;
b=(b*b)%k;
}
return ans;
}
洛谷 P1226 【模板】快速幂||取余运算的更多相关文章
- 洛谷P1226 【模板】快速幂||取余运算
题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod k=s” s为运算结果 S1: ...
- 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 ...
随机推荐
- 【Vue.js】加载更多—vue-infinite-scroll
引言 今天用到了一个加载更多的插件,用起来很方便,插件的名字叫做vue-infinite-scroll 我们可以去npmjs.com官网看一下这个vue-infinite-scroll的用法,官网上面 ...
- 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(3)- 串口功能实现(pySerial)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之串口功能实现. 串口调试助手是最核心的当然是串口数据收发与显示的功能,Jays-PyCOM借助的是 ...
- Perl List::Util模块用法详解
本文介绍Perl标准库List::Utils中的列表工具,有时候它们非常好用.比如Perl中测试列表中是否包含某个元素(某个元素是否存在于列表中)没有比较直接比较方便的功能,但使用List::Util ...
- Java开发笔记(二十一)二维数组的扩展
前面介绍的数组容纳的是一串数字,仿佛一根线把这组数字串了起来,故而它只是一维数组.一维数组用来表示简单的数列尚可,要是表达复杂的平面坐标系,那就力不从心了.由于平面坐标系存在水平和垂直两个方向,因此可 ...
- Android破解学习之路(十)—— 我们恋爱吧 三色绘恋 二次破解
前言 好久没有写破解教程了(我不会告诉你我太懒了),找到一款恋爱游戏,像我这样的宅男只能玩玩恋爱游戏感觉一下恋爱的心动了.. 这款游戏免费试玩,但是后续章节得花6元钱购买,我怎么会有钱呢,而且身在吾爱 ...
- (5)Maven快速入门_5maven聚合与继承_scope依赖范围
多个maven项目实现统一管理, maven 插件jar继承自父的maven项目.对maven中jar的版本进行管理. 1.创建一个项目来管理多个maven项目 new ----maven Proje ...
- C#设计模式之二十一访问者模式(Visitor Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第九个模式,该模式是[访问者模式],英文名称是:Visitor Pattern.如果按老规矩,先从名称上来看看这个模式,我根本不能获得任何对理解该模式有用的 ...
- input type date 解决移动端显示placeholder
在最近的一个项目中使用到了html5的一个新标签属性,type="date"时,发现placeholder属性失效无法使用. 如果是这样的效果,那么客户体验是可想而知的差了. 最后 ...
- ajax点击加载更多数据图片(预加载)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Bable实现由ES6转译为ES5
Babel是一个广泛使用的转码器,可以将ES6代码转译为ES5代码,从而在现有环境下执行. 举例说明: 转译前(ES6格式)代码如下: let User = { name : '张三', age : ...