[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,快了很多

以上

原文地址:https://www.cnblogs.com/qiulinzhang/p/9717401.html

时间: 2024-11-13 11:30:04

[Math_Medium] 372. Super Pow 2018-09-27的相关文章

372. Super Pow

/* * 372. Super Pow * 2016-7-16 by Mingyang */ private int mod = 1337; public int superPow(int a, int[] b) { int n = b.length; int ans = 1; for (int i = n - 1; i >= 0; i--) { ans = ans * quick_pow(a, b[i]) % mod; a = quick_pow(a, 10); } return ans; }

装饰器 总结 2018.09.27

1. 什么是装饰器 器=>工具 装饰=>指的是为被装饰对象添加新功能 装饰器本身可以是任意可调用的对象=>函数 被装饰器本身也可以是任意可调用的对象=>函数 目标:写一个函数来为另外一个函数来添加一个新功能 2.为何要用装饰器 开放封闭原则:然间一旦上线就应该对修改封闭,对扩展开放 对修改封闭: 1.不能修改功能的源代码 2.也不能修改功能的调用方式 对扩展开放: 可以为原有功能添加新的功能 目标:就是在遵循1和2原则的前提下为被装饰对象添加上新功能 3.如何要用装饰器 1.无参装

LeetCode 第 372 题 (Super Pow)

LeetCode 第 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. Example1: a = 2 b = [3] Result: 8 Example2: a = 2 b = [1,0] Result: 1024 这道题与

【谜客帝国】第138届荷影主擂谜会(2018.09.30)

 [谜客帝国]第138届荷影主擂谜会(2018.09.30) 主持:瓷   计分:钱少 1.日落寒云起,星月当空明(2字国画名词)生宣 2.都头刀下留心点(2字周杰伦歌曲)忍者 3.人来乡中上集市(2字古代帝王)仲雍 4.一见钟情(2字格非作品二)相遇.初恋 5.花园四周飘芬芳(5字曹组词句)香在无心处 6.“君泪盈,妾泪盈”( 4字苏轼词句)一分流水 7.心系意中人,岂可失先机(世界杯球员)凯恩 8.实干重点放在前,着眼未来立头功(3字数学名词)平方差 9.初秋晓起西佛寺(2字道教称谓)侍香

【谜客帝国】第137届雪山飞狐主擂谜会(2018.09.15)

[谜客帝国]第137届雪山飞狐主擂谜会(2018.09.15) 主持:瓷   计分:小沪 01.江畔和风临,村前白杨飘(3字中药方剂)枫香汤 02.“天堑变通途”(2字世界体育组织简称)桥联 [注:面出毛[泽]东<水调歌头·游泳>,承上句“一桥飞架南北”.] 03.“彩蟾特地中宵出”(3字纺织品)夜光布 [注:面出宋·曹勋<鹧鸪天>,彩蟾,月亮别称.] 04.停船靠岸处,乃是第一墟(3字河北地名)泊头市 05.山松弄影塘边立(3字清末历史人物)唐景崧 06.“子房以盖世之才”(3字

static2014年6月9日09:27:29

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Static再谈 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 A a = new A(); 14 a.Hello();//实例对

2018.09.22 上海大学技术分享 - An Introduction To Go Programming Language

老实说笔者学习 Go 的时间并不长,积淀也不深厚,这次因缘巧合,同组的同事以前是上海大学的开源社区推动者之一,同时我们也抱着部分宣传公司和技术分享的意图,更进一步的,也是对所学做一个总结,所以拟定了这次分享.另外与会的同学大多都是大二大三的"萌新",考虑到受众水平和技术分享的性质,所以实际上这次分享涉及到的知识点都相对基础,当然为了寓教于乐,本人也十分讨厌着重介绍基础语法时可能引起的枯燥,所以加了少少的私货,并且也针对 1.11 及之前版本中或优雅,或局限的特性做了发散性的讲解. 总而

【VSCode】Windows下VSCode编译调试c/c++【更新 2018.03.27】

--------– 2018.03.27 更新--------- 便携版已更新,点此获取便携版 已知BUG:中文目录无法正常调试 用于cpptools 0.15.0插件的配置文件更新 新的launch.json // Available variables which can be used inside of strings. // ${workspaceRoot}: the root folder of the team // ${file}: the current opened file

我关注的一周技术动态 2015.09.27

分布式系统实践 1. 走向分布式 http://dcaoyuan.github.io/papers/pdfs/Scalability.pdf 要点: 这是台湾的一个作者写的为期30天的分布式系统设计学习小册子, 刚开始涵盖了分布式系统设计的基本理论, 包括partiton, replication和CAP理论, 后面以kafka和zookeeper为例, 将上述理论加以实例化介绍, 内容非常精简, 适合初学者阅读和学习. 2. 如何编写一个分布式数据库 http://mp.weixin.qq.c