十进制快速幂算法
介绍一下十进制快速幂
由于这道题的指数还在\(long long\)的范围内,比较小,快速幂可以用二进制的来实现。
但是我们考虑到在指数非常大时该怎么办,例如\(k=10^{100000}\)。如果你想写高精那么我不会阻挡你,只要你不嫌麻烦。
那么现在进入正题,如果你了解了快速幂的本质,那么十进制快速幂不是什么问题,如果不了解,请先去仔细阅读别的题解。
十进制快速幂和二进制没有什么本质的区别,一个是十进制拆分指数,另一个是二进制拆分指数。
例如\(3^{405}\)可以拆分为 \((3^{1})^{5} * ( 3^{10} )^{0} * ( 3^{100} )^{4}\)
那么代码就可以很轻松地写出来了
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ri register int
#define ll long long
ll b,t,h,P;
char c[ 100007 ];
ll TenthPow( ll a ){
ll ans = 1,s = a;
while( t >= 0 ){
ll cnt = c[ t ] - '0',cur = s;
for( ri i = 1 ; i <= cnt ; ++i )
ans = ans * s % P;
//和二进制快速幂不同的地方之一,请结合上面列举的拆分过程理解
for( ri i = 1 ; i < 10 ; ++i )
cur = cur * s % P;
//进位
s = cur;
ans %= P;
--t;
}
return ans;
}
int main()
{
cin>>b>>c>>P;
t = strlen( c );--t;//字符串读入指数,指数可能达到几十万位
cout<<b<<"^"<<c<<" mod "<<P<<"="<<TenthPow( b );
return 0;
}
但是在平时的使用中仍然推荐使用二进制快速幂,其复杂度比十进制更优,十进制快速幂只是为了用来应付一些无聊的出题人。