时间限制: 1000 ms 内存限制: 65536 KB
提交数: 11777 通过数: 5413
【题目描述】
输入b,p,k的值,求b^p mod k的值。其中b,p,k×k为长整型数。
【输入】
输入b,p,k的值。
【输出】
求b^p mod k 的值。
【输入样例】
2 10 9
【输出样例】
2^10 mod 9=7
自己的代码(长整型运算可能会存在超时间复杂度和内存的情况):
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int i;
long long int a=1,b,p,k,n,s;
scanf("%lld %lld %lld",&b,&p,&n);
k=b;
if(p==0) s=1;
else
{
for(i=1;i<p;i++)
{
b=k*b;
}
s=b%n;
}
printf("%lld^%lld mod %lld=%lld",k,p,n,s);
//cout<<k<<"^"<<p<<" mod "<<n<<"="<<s;
return 0;
}
书上的代码:
#include <iostream>
#include<cstdio>
using namespace std;
int b,p,k,a;
int f(int p) //利用分治算法求b^p%k;
{
if(p==0) return 1; //b^0 % k =1
int tmp=f(p/2)%k;
tmp=(tmp*tmp)%k;
if(p%2==1)
tmp=(tmp *(b%k))%k; //b^p % k = (b^(p/2))^2 % k
if(p % 2 == 1)
tmp=(tmp * (b%k)) % k; //如果p为奇数,则b^p % k = ((b^(p/2))^2)*b % k
return tmp;
}
int main()
{
cin>>b>>p>>k; //读入三个数
int tmpb=b; //将b的值备份
b%=k; //防止b的值太大
printf("%d^%d mod%d=%d\n",tmpb,p,k,f(p)); //输出
return 0;
}