介绍一下十进制快速幂
由于这道题的指数还在\(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; }
但是在平时的使用中仍然推荐使用二进制快速幂,其复杂度比十进制更优,十进制快速幂只是为了用来应付一些无聊的出题人。