acm新手小白必看系列之(7)——快速幂取模精讲及例题

  • 性质1:(a+b)%m=(a%m+b%m)%m
  • 性质2:(ab)%m=(a%mb%m)%m

给你一个数a,让你求其b次连乘后的结果
当b很小时,一般的循环算法可以解决这个问题(O(B)),但是当b较大时呢
要知道1e18以上,就会long long int 也可能会溢出
而在数论方面这些数又该如何表示?怎样存储?
所以在此我们定义一个模数mod来代替输出即

a^b=k1*mod+t即t=a^b%mod

对于这样的问题,我们将采用分治的思想来解决这种问题。(啥叫分治呢,这个一时半会说不完,一会简单来说)

a^b=((a^(b/n))^n)*a^(b%n)

当n=2时

a^b=(a^(b/2))*(a^(b/2))*a^(b%2)
(a^b)%mod=(a^(b/2))%mod*(a^(b/2))%mod*a^(b%2)%mod

而后对a^(b/2)进行相同的操作
下面解释一下分治是什么
五大算法之一____分治
分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……此法需要大量的练习才能体会。

  • 递归
typedef long long ll;//typedef 类型 新名字;就可以把long long简化成ll来写了
ll quickmod(ll a,ll b,ll c)
{if(b==1)return a;if(!(b&1)){ll t=quickmod(a,b/2,c);return t*t%c;}else{ll t=quickmod(a,b/2,c);return t*t%c*a%c;}
}
  • 非递归
typedef long long ll;//typedef 类型 新名字;ll quickmod(ll a,ll b,ll c)
{int ret=1;while(b){if(b&1)ret=ret*a%c;a=a*a%c;b/=2;}return ret;
}

相信大家看了这么多还是不太明白,下面来个咱来个“明白题”(白给)
1.白给的快速幂取模
给定A,B,C,计算A^B%C,这里A^B代表A的B次方
Input
输入数据有多组,每组数据一行,有3个正整数分别为A,B和C,1<=A,B,C<=1000000000
Output
输出A^B%C的值
Sample Input
2 3 5
8 2 10
Sample Output
3
4

#include <bits/stdc++.h>//套模板吧,但是要理解其核心
using namespace std;
long long mode(long long a,long long b,long long mod)
{long long ans=1;while(b){if(b%2==1){b--;ans=ans*a%mod;}a=a*a%mod;b=b/2;}return ans;
}
int main()
{long long a,b,c;while(cin>>a>>b>>c)printf("%lld\n",mode(a,b,c));return 0;
}

2.小蓝数学题
xaiolan很喜欢做各种高深莫测的数学题,一天,她在书上看到了这么一道题。a[1]=6,a[2]=18;a[n]=2*a[n-1]+3*a[n-2](n>=3),对于给出的某个数字n,求a[n]。xiaolan一想这道题太简单了,可是看到n的范围是(n<=1e18),对于这么大范围的数,xiaolan不知道该怎么做了,聪明的你,快来帮帮库xiaolanjiejie解决这个问题吧。(由于答案可能很大,请将答案对1e9+7(即1000000007)取模)。

Input

一个整数n(1<=n<=1e18)

Output

a[n]对1e9+7取模后的答案

Sample Input

5

Sample Output

486
关键点推出a[n]=6乘3的(n-1)次幂

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,mod=1e9+7;
ll quickmod(ll a,ll b)
{ll s=1;while(b){if(b&1)s=s*a%mod;a=a*a%mod;b=b/2;}return s;
}
int main()
{ios::sync_with_stdio(false);//取消同步,详请看往期cin>>n;printf("%lld\n",6*quickmod(3,n-1)%mod);//注意算出3的n-1次幂,再乘以6之后一定还要再取模!return 0;
}

我知道你还没懂,所以
已知 2^3 求 2^6, 不就是 2^3 * 2^3
快速幂就是这个原理。
遇到奇数怎么办?
那不就是 2 * 2 ^ 4 这不就成了嘛~~
所以这就是快速幂的基本思路求a ^ b
1)当b是奇数时,那么有 a^b = a * a^(b-1)
2)当b是偶数时,那么有 a^b = a^(b/2) * a^(b/2)
举个例子?2 ^10

   2^10 = 2^5 * 2^52^5 = 2 * 2^42^2 = 2^1 * 2^12^1 = 2 * 2^0

3.这个看看他的写的,详细(手动滑稽)但是他没有我讲解的系统啦~

练习题(应铁粉要求特增加习题栏~代码会在下一节公布)

4.越狱
Description
  监狱有连续编号为1…N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果
相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱
Input

输入两个整数M,N.1<=M<=10^8,1<=N<=10^12

Output
  可能越狱的状态数,模100003取余
Sample Input
2 3
Sample Output
6
HINT
  6种状态为(000)(001)(011)(100)(110)(111)

  • 下节提示
  • acm新手小白必看系列之(8)——二分法精讲及例题

acm新手小白必看系列之(7)——快速幂取模精讲及例题相关推荐

  1. acm新手小白必看系列之(3)——暴力枚举精讲及例题

    acm新手小白必看系列之(3)--暴力枚举精讲及例题 暴力枚举说白了就是列举所有情况,然后一个一个排查. 这节多说无益直接上题(这节假的精讲) 1·大乐透 在小明曾经玩过的一种对号码的纸牌游戏(乐透) ...

  2. acm新手小白必看系列之(5)——枚举进阶例题精讲

    acm新手小白必看系列之(5)--枚举进阶例题精讲 1.牛奶碑文(暴力枚举) 小伟暑假期间到大草原旅游,在一块石头上发现了一些有趣的碑文.碑文似乎是一个神秘古老的语言,只包括三个大写字母 C.O 和 ...

  3. acm新手小白必看系列之(8)——二分法精讲及例题

    acm新手小白必看系列之(8)--二分法精讲及例题 二分,分的是答案,直接在答案在的区间范围中二分,分出一个值,就判断是不是答案,并进行转移 如果已知候选答案的范围(min,max)(单调有序),(无 ...

  4. acm新手小白必看系列之(9)——栈精讲及例题

    acm新手小白必看系列之(9)--栈精讲及例题 先进栈后出栈 可以把栈想象成一个上端开口的杯子.... 栈只能定义为在一端进行插入和删除操作 1.程序员问题 程序员输入程序出现差错时,可以采取以下的补 ...

  5. acm新手小白必看系列之(10)——队列精讲及例题

    acm新手小白必看系列之(10)--队列精讲及例题 队列其实是很复杂的,有很多种队列的情况 下面只讲基础能用上的 队列:先进先出 在这里,我将引入两个整型变量head和tail.head用来记录队列的 ...

  6. acm新手小白必看系列之(1)——二维数组及结构体精讲附带例题

    *acm新手小白必看系列之(1)--二维数组及结构体 ** c++准备工作** (可能小白像我一样也是学习的c语言) 万能头文件,放在第一行 #include<bits/stdc++.h> ...

  7. 新手python爬虫代码_新手小白必看 Python爬虫学习路线全面指导

    爬虫是大家公认的入门Python最好方式,没有之一.虽然Python有很多应用的方向,但爬虫对于新手小白而言更友好,原理也更简单,几行代码就能实现基本的爬虫,零基础也能快速入门,让新手小白体会更大的成 ...

  8. 计算机新手教程装系统,新手小白必看电脑重装系统教程 四种方法至少会一种就够用!...

    电脑买来时间久了,就会出来卡顿.蓝屏等很多问题.你的电脑有这些问题吗?当电脑出现这些问题时,我们该怎么做呢?当然就是给电脑重装系统,那么你会给电脑重装系统吗?小白必看的电脑重装系统教程哦! 给电脑装系 ...

  9. 新手小白必看!自媒体运营攻略!

    今天这期内容主要是给大家做一个总结,新手做自媒体常见的一些问题,大周建议先点赞加收藏再继续往下看吧. 直接上干货: 1.自媒体适合新手小白做吗? 大周认为很适合,从现在开始还不晚.自媒体最大的魅力就在 ...

最新文章

  1. .NET Core程序中使用User Secrets存储敏感数据
  2. 职业生涯又一个转折点
  3. python软件加密、固定机器使用_如何用Python进行最常见的加密操作?(附最新400集Python教程)...
  4. 能在微软的网站找到IeWebcontrols的安装文件吗
  5. 最短路(遍历边)计蒜客—DD坐地铁
  6. 编程一小时 code.org [六一关注]
  7. java怎么定义范围_java – Dagger自定义范围,怎么办?
  8. 《数字时代汽车营销变革白皮书》发布,为新消费时代的车企营销提供指南
  9. kido机器人没反应_QQ机器人常见故障排除方法
  10. activex与matlab,在MATLAB图形用户界面设计中使用ActiveX控件
  11. 本特利330906-02-12-05-02-CN传感器
  12. 计算机网络 | 划分子网
  13. EPT和VPID简介
  14. 在unity中,模型自动旋转
  15. Python调用阿里API进行车牌识别
  16. 骨传导耳机怎么选?一文告诉你骨传导耳机推荐哪个牌子
  17. 在OpenCV里使用背景去除
  18. O2O有哪些平台 O2O平台的共同点是什么?
  19. 海康威视监控,RSTP转m3u8展示在移动端网页
  20. JAVA毕业设计快递配送平台计算机源码+lw文档+系统+调试部署+数据库

热门文章

  1. 程序员刷 leetcode 经常陷入刷了忘忘了刷的尴尬局面怎么办?
  2. STM入门32(二十七)----FSMC
  3. 九度oj-1114-神奇的口袋
  4. 互联网+控销创新医药新控销模式
  5. 行转列方法 及 pivot函数使用问题
  6. VR技术在教育中的应用:如何帮助学生更好地理解和掌握知识
  7. 潍坊工厂车间数字化vr三维仿真系统,vr电力虚拟仿真培训系统,vr消防安全教育体验馆
  8. Anroid组件化构架设计
  9. 小程序不引入基础组件实现weui使用(附加小程序换行显示)
  10. SOHO 为自己的人生买单