51Nod 1046 A^B Mod C(快速幂)

来源:互联网 发布:四川水利水电预算软件 编辑:程序博客网 时间:2024/06/07 07:09

题目链接

快速幂

假如计算3^11

把11写成二进制为:1011

现在就可以计算11=2^3+2^1+2^0

3^11=3^(2^3+2^1+2^0)=3^(2^3)*3^(2^1)*3^(2^0)

然后1011和1进行与运算,判断最后一位是否是1,为1的话相乘

然后temp初值为3,代表3的n次方。n一直成倍增加,所有temp每次都是自乘

每次都更新,代表幂的增加,同时b>>1(或着b/=2)

接下来就判断101和1与运算。。。。。最后直接b为0

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;int main(){long long a,b,c;cin>>a>>b>>c;long long  sum=1,temp=a;while(b){if(b&1) sum=(sum%c)*(temp%c)%c;temp=(temp%c)*(temp%c)%c;b=b>>1;}cout<<sum;return 0;}

原创粉丝点击