leecode 解题总结:372. Super Pow
来源:互联网 发布:电脑蓝牙软件下载 编辑:程序博客网 时间:2024/06/06 03:47
#include <iostream>#include <stdio.h>#include <vector>#include <string>using namespace std;/*问题: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 = 2b = [3]Result: 8Example2:a = 2b = [1,0]Result: 1024分析:由于是求a^b % 1337,而且b特别大,我们知道如果数字超过1337就肯定取余,能否不需要求出b,而是b的举例:2^10 % 1337 = 1024 2^11 % 1337 = 2048 % 1337 = 711我们可以求出这样一个值k,使得 a^k < 1337 , a^(k+1) >= 1337然后对b进行处理,如果b <= k , 那么直接计算;如果 b > k,分解b=n*k + c,其中c属于0到k-1a^b=a^(n*k + c) = a^(n*k) + a^c = (a^k)^n + a^ca^b % 1337 = (a^k % 1337) ^ n + (a^c) % 1337分解为b-k, k两部分a^(b-k) % 1337参考:http://blog.csdn.net/qq508618087/article/details/51860222a^b % k = (a % k)^b % k ,公式【1】x*y % k = ( x % k )*(y % k) % k , 公式【2】x^(a+b) % k = (x^a % k)*(x^b % k) % k,公式【3】x^(a*b) % k = (x^a)^b % k = (x^a % k)^b % k,公式【4】f(a,b)表示a^b % ka^1234560 % k = (a^123456)^10 % k = (a^123456 % k)^10 % k f(a , 1234567) = f(a , 1234560) * f(a,7) % k =f( f(a,123456), 10 ) * f(a,7) % k公式1:减少a的值;公式3:将数组先分解为最低位和剩余高位,例如:a^123 % k = (a^120 % k) * (a^3 % k) % k公式4:然后对剩余高位分解为高位的10次方,例如a^120 % k = a^(12*10) % k = (a^12 % k)^10 % k输入:2 1(数组元素个数)32 21 02 21 1输出:81024711关键:1 a^b % k = (a % k)^b % k ,公式【1】x*y % k = ( x % k )*(y % k) % k , 公式【2】x^(a+b) % k = (x^a % k)*(x^b % k) % k,公式【3】x^(a*b) % k = (x^a)^b % k = (x^a % k)^b % k,公式【4】f(a,b)表示a^b % ka^1234560 % k = (a^123456)^10 % k = (a^123456 % k)^10 % k f(a , 1234567) = f(a , 1234560) * f(a,7) % k =f( f(a,123456), 10 ) * f(a,7) % k公式1:减少a的值;公式3:将数组先分解为最低位和剩余高位,例如:a^123 % k = (a^120 % k) * (a^3 % k) % k公式4:然后对剩余高位分解为高位的10次方,例如a^120 % k = a^(12*10) % k = (a^12 % k)^10 % k*/const int base = 1337;class Solution {public://计算a^k % 1337的结果int superMod(int a , int k){a %= base;//减少a的值int result = 1;for(int i = 0 ; i < k ; i++){result = (result * a) % base;//边乘,边取余,防止溢出}return result;} int superPow(int a, vector<int>& b) { //递归出口if(b.empty()){return 1;}int lastDigit = b.back();b.pop_back();int highResult = superPow(a , b);//递归求解剩余部分的值int highValue = superMod( highResult , 10) % base;//是高位部分结果的10次方int lowValue = superMod(a , lastDigit) % base;//低位部分的次方int result = highValue * lowValue % base;return result; }};void process(){ vector<int> nums; int value; int num; Solution solution; int result; int a; while(cin >> a >> num ) { nums.clear(); for(int i = 0 ; i < num ; i++) { cin >> value; nums.push_back(value); } result = solution.superPow(a , nums); cout << result << endl; }}int main(int argc , char* argv[]){process();getchar();return 0;}
0 0
- leecode 解题总结:372. Super Pow
- leecode 解题总结:50. Pow(x, n)
- leecode 解题总结:313. Super Ugly Number
- [leetcode] 372. Super Pow 解题报告
- [Leetcode] 372. Super Pow 解题报告
- Leetcode 372. Super Pow 快速幂计算 解题报告
- LeetCode 372. Super Pow解题思路(超详细)
- leetcode.372. Super Pow
- LeetCode 372. Super Pow
- 372. Super Pow
- 372. Super Pow
- [LEETCODE] 372. super pow
- LeetCode--372. Super Pow
- 372. Super Pow
- leetcode 372. Super Pow
- Leetcode 372. Super Pow
- [leetcode] 372. Super Pow
- Leetcode: 372.Super Pow
- 协方差矩阵概念及其计算
- 调试WebService接口的小工具-storm
- FZU 2109 Mountain Number (数位DP)
- python核心数据类型 -- 概览
- Reverse a String
- leecode 解题总结:372. Super Pow
- iOS可变参数和Format Function
- 点击Edittext,禁止软键盘弹出
- 八大排序算法之堆排序解析
- IDEA 创建MAVEN 项目
- C语言调用Lua编译问题总结
- (转载)机器学习知识点(十五)从最大似然到EM算法浅解
- Java23种设计模式:Iterator设计模式(三)
- dblink跨域查询数据库