• [Math_Medium] 372. Super Pow 2018-09-27


    原题:372. Super Pow

    Your task is to calculate ab mod 1337 where a is a positive integer and b is an extremely large positive integer given in the form of an array.

    题目大意:

    给定两个数 a, b,其中 b 会非常大,因此 b 用一个 int 的 的数组给出,然后求 (a^b\%1337)

    初始思路1:

    首先 ((a*b)\%M = ((a\%M)*(b\%M))\%M),当数比较大的时候或者其乘积比较大的时候可以通过分开取模实现
    第二个问题:由于数b非常大,因此可以分开求,利用二分求快速幂
    第三个问题:数 b 的每一个数字存在一个数组中,因此可以模拟除法,从高位起,每次除以2,直到除完为止(每一位都为0为止)

    代码如下:

    class Solution {
    public:
        bool check(vector<int>&b)
        {
            int temp = 0;
            for(int i = 0; i< b.size(); i+=1)
            {
                temp += (b[i]);
            }
            if(temp == 0)
                return false;
            else
                return true;
        }
    
        int superPow(int a, vector<int>& b)
        {
            int ans = 1;
            while(check(b))
            {
                if((b[b.size()-1]) & 1)
                {
                    ans = ((ans % 1337) * (a % 1337)) % 1337;
                }
                a = ((a%1337) * (a%1337) % 1337);
                for(int i = 0; i < b.size(); i += 1)
                {
                        if((b[i] % 2 == 1) && (i != (b.size()-1)))
                        {
                            b[i+1] += 10;
                        }
                        b[i] >>= 1;
                }
            }
            return ans;
        }
    };
    

    这样的效果非常慢,结果980ms,勉强AC

    优化思路:

    从最后一位开始,每次处理一位,利用递归
    (a^{1234567}\% k = (a^{1234560}\% k) * (a^7 \% k) \% k = (a^{123456} \% k)^{10} \% k * (a^7 \% k) % k)
    假设 (f(a, b))计算 (a^b\%M),则:
    (f(a, 1234567)\%M =f(a, 1234560) * f(a, 7) \% M= (f(f(a, 123456), 10) * f(a, 7))\%M)

    代码如下:

    class Solution {
    public:
        int quick(int a, int b, int mod)
        {
            int ans = 1;
            while(b)
            {
                if(b&1)
                {
                    ans = (ans % mod) * (a % mod) % mod;
                }
                a = (a%mod) * (a % mod) % mod;
                b >>= 1;
            }
            return ans;
        }
        int superPow(int a, vector<int>& b) 
        {
            if(b.empty())
                return 1;
            int last_digit = b.back();
            b.pop_back();
            return (quick(superPow(a, b), 10, 1337) * quick(a, last_digit, 1337)) % 1337;
        }
    };
    

    耗时8ms,快了很多

    以上

  • 相关阅读:
    十五、函数助手
    REST介绍以及常用的返回状态码
    十四、配置元件之计数器
    十三、参数化
    十二、jmeter目录结构
    十一、HTTP请求之Content-Type
    十、元件的作用域与执行顺序
    九、配置命令行模式
    04-传输层(3)
    03-传输层(2)
  • 原文地址:https://www.cnblogs.com/qiulinzhang/p/9717401.html
Copyright © 2020-2023  润新知