快速幂+费马小定理的简单应用

参考:

(49条消息) 快速幂算法(全网最详细地带你从零开始一步一步优化)_刘扬俊的博客-CSDN博客_快速幂算法

(a + b) % p = (a % p + b % p) % p 1

(a - b) % p = (a % p - b % p ) % p 2

(a * b) % p = (a % p * b % p) % p 3

核心:

若幂指数不为0,幂指数变为原来的一半,基数等于基数的平方

计算所有幂指数为奇数项的乘积。

1.power&1代替power%2!=0:

如果power为偶数,则其二进制表示的最后一位一定是0;如果power是奇数,则其二进制表示的最后一位一定是1。将他们分别与1的二进制做“与”运算,得到的就是power二进制最后一位的数字了,是0则为偶数,是1则为奇数。

 

2.对于power=power/2来说,也可以用更快的“位运算”进行替代,我们只要把power的二进制表示向右移动1位就能变成原来的一半了。

 

 1 //模板
 2 long long fastPower(long long base, long long power) {
 3     long long result = 1;
 4     while (power > 0) {
 5         if (power & 1) {//此处等价于if(power%2==1)
 6             result = result * base % 1000;
 7         }
 8         power >>= 1;//此处等价于power=power/2
 9         base = (base * base) % 1000;
10     }
11     return result;
12 }

 

 1 //2的1000000000次方的后三位
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 long long fastpower(int base,int power)
 5 {
 6     long long r=1;
 7     while(power>0)
 8     {
 9         if(power&1)
10         {
11             r=r*base%1000;
12         }
13         power>>=1;
14         base=base*base%1000;
15     }
16     return r;
17 }
18 int main()
19 {
20     long long base,power;
21     cin>>base>>power;
22     cout<<fastpower(base,power)<<endl;
23     return 0;
24 }

 

 

扩展:

费马小定理:

A^B%p=[A^B%(P-1)]%P;

例:

(A^B^C)%P;

因为:A^B=[A^B%(P-1)]%P

所以把B换成B^C得:

A^B=[A^(B^C)%(P-1)]%P

 

“蓝桥杯”练习系统 (lanqiao.cn)

输入格式

一行,三个整数ABC,以空格隔开。

输出格式

输出ABC次方次方%1,000,000,007

样例输入

3 4 5

样例输出

763327764

数据规模和约定

0≤A,B,C≤1,000,000,000

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long 
 4 ll power(ll a,ll b,ll p)
 5 {
 6     ll ans=1;
 7     while(b>0)
 8     {
 9     if(b&1) 
10     ans=ans*a%p;
11     b>>=1;
12     a=a*a%p;
13     }
14     return ans;
15 }
16 int main()
17 {
18     ll a,b,c;
19     cin>>a>>b>>c;
20     ll p=1000000007;
21     cout<<power(a,power(b,c,p-1),p)<<endl;
22 }

 

posted @ 2022-04-16 21:27  格蕾  阅读(111)  评论(0)    收藏  举报