zoukankan      html  css  js  c++  java
  • 十进制快速幂算法

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

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

  • 相关阅读:
    POJ 1300 Open Door
    POJ 2230 Watchcow
    codevs 1028 花店橱窗布置
    codevs 1021 玛丽卡
    codevs 1519 过路费
    codevs 3287 货车运输
    codevs 3305 水果姐逛水果街二
    codevs 1036 商务旅行
    codevs 4605 LCA
    POJ 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/hzyhome/p/11658244.html
Copyright © 2011-2022 走看看