• 十进制快速幂算法


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

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

  • 相关阅读:
    2018常用DOM操作总结
    emlog实现全站pjax无刷新加载页面
    深入理解Vuex 框架
    2018前端最火的web UI框架
    小程序快递单号查询
    表单元素系列二
    表单元素系列一
    表单提交
    AJAX 回调函数刷新页面问题
    electron 常用命令
  • 原文地址:https://www.cnblogs.com/hzyhome/p/11658244.html
Copyright © 2020-2023  润新知