十进制快速幂算法

自古美人都是妖i 提交于 2019-12-01 05:23:43

原文章是我在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;
}

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!