题目描述
输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整型数。
输入输出格式
输入格式:
三个整数b,p,k.
输出格式:
输出“b^p mod k=s”
s为运算结果
思路:
显然取余和乘法谁都会
关键在于快速
我们知道乘方有一个性质
x^n=(x^2)^(n/2)
这样我们就能通过二分使时间复杂度降到log级别
你可能会说,n%2==1怎么办??
和简单,再定义一个变量作为暂存器,乘一下x
这时候又有另一个定理
x^n=x^(n-1)*x
所以n可以减一
最后将暂存器和x乘起来即可
代码:
#include<iostream> #include<cstdio> using namespace std; int a,b,s; int res=1; int pw(int j,int k) { if(k==0) { res=res%s; return res; } j=j%s; if(k%2==1) { res=res*j; res=res%s; k--; pw(j,k); } else { k=k/2; j=j*j; pw(j,k); } } int main() { cin>>a>>b>>s; long long x=1; x=pw(a,b); cout<<a<<"^"<<b<<" mod "<<s<<"="<<x; }
原文地址:https://www.cnblogs.com/ztz11/p/8973023.html
时间: 2024-10-25 08:54:02