洛谷1226:https://www.luogu.org/problemnew/show/P1226
输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整型数。
0^0=1 or 0^0=0?
递归:
long long ksm(long long x)//递归
{
long long temp;
if (x==1)
return b;
temp=ksm(x/2);
if (x%2==0)
return (temp*temp)%k;
else
return (temp*temp%k)*b%k;
}
非递归:
long long ksm1()//非递归
{
long long i=0,j,q1=q;
long long temp;
while (q1!=1)
{
i++;
a[i]=q1%2;
q1/=2;
}
temp=b;
for (j=i;j>=1;j--)
{
if (a[j]==1)
temp=(temp*temp%k)*b%k;
else
temp=(temp*temp)%k;
}
return temp;
}
标程:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
long long b,q,k,b1;
int a[1000000];
long long ksm(long long x)//递归
{
long long temp;
if (x==1)
return b;
temp=ksm(x/2);
if (x%2==0)
return (temp*temp)%k;
else
return (temp*temp%k)*b%k;
}
long long ksm1()//非递归
{
long long i=0,j,q1=q;
long long temp;
if (k==0 || (b==0 && q==0))
return 0;
if (q1==0)
return 1;
while (q1!=1)
{
i++;
a[i]=q1%2;
q1/=2;
}
temp=b;
for (j=i;j>=1;j--)
{
if (a[j]==1)
temp=(temp*temp%k)*b%k;
else
temp=(temp*temp)%k;
}
return temp;
}
int main()
{
freopen("a.txt","r",stdin);
scanf("%lld%lld%lld",&b1,&q,&k);
b=b1%k;
printf("%lld^%lld mod %lld=%lld\n",b1,q,k,ksm1());
return 0;
}