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
原创粉丝点击