YZhe的头像

十进制快速幂算法

原文章是我在csdn上写的
题目链接

介绍一下十进制快速幂

由于这道题的指数还在\(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;
}

但是在平时的使用中仍然推荐使用二进制快速幂,其复杂度比十进制更优,十进制快速幂只是为了用来应付一些无聊的出题人。

posted @ 2019-10-12 08:20  YZhe  阅读(487)  评论(0编辑  收藏  举报
ヾ(≧O≦)〃嗷~