北京化工大学寒假集训【BUCTOJ】(1)1-6题
1.快速幂 题目描述 求 a 的 b 次方对 p 取模的值,其中 0≤a,b≤10^9 , 0<p≤10^9 输入 三个用空格隔开的整数a,b和p。 输出 一个整数,表示a^b mod p的值。 样例输入 2 3 9 样例输出 8 对于本题,按照以往的思路是直接循环进行乘法,同时,边乘边取模,最终能够得到结果,但是本题由于乘的次数过多导致运算时间过于长,所以要考虑的就是怎样通过改进算法来缩短计算时间 这里就有了快速幂,快速幂的目的就是快速求出幂,假设我们要求a^b,按照朴素算法就是把a连乘b次,这样一来时间复杂度是O(b)也即是O(n)级别,快速幂能做到O(logn),快了好多好多。它的原理如下: 当幂指数非常大的时候,我们并没有必要一次又一次的反复求,假设我们本来要求2 1024 我们可以依次求得2 2 、2 4 、2 8 、……2 1024 这样,原本需要1024次循环,现在只用了10次,时间也就大大缩短了。 同理我们可以推进到一般情况,b可以拆解为若干不重复的2的次幂的和的形式,即可以用二进制的形式来表示,巧妙的运用位运算或者模运算,可以得到每一位前的系数为0或者1来达到快速幂的目的 # include <bits/stdc++.h> using namespace std ; long long a , b , p ; long long f ( long long a ,