Skip to content

Latest commit

 

History

History
101 lines (80 loc) · 5.48 KB

CP_Problem_6.md

File metadata and controls

101 lines (80 loc) · 5.48 KB

Write the JAVA program for the below problem statement: 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. Example 1: Input: a = 2, b = [3] Output: 8 Example 2: Input: a = 2, b = [1,0] Output: 1024 Example 3: Input: a = 1, b = [4,3,3,8,5,2] Output: 1 Constraints: 1 <= a <= 231 - 1 1 <= b.length <= 2000 0 <= b[i] <= 9 b does not contain leading zeros.

Here's the Java program that solves the given problem:

java

public class PowerModulus {
    public int superPow(int a, int[] b) {
        int mod = 1337;
        int result = 1;
        a = a % mod;
        for (int i = b.length - 1; i >= 0; i--) {
            int exponent = b[i];
            int partialResult = 1;
            for (int j = 0; j < 10; j++) {
                partialResult = (partialResult * a) % mod;
            }
            result = (result * pow(partialResult, exponent)) % mod;
            a = pow(a, 10) % mod;
        }
        return result;
    }

    private int pow(int base, int exponent) {
        if (exponent == 0) {
            return 1;
        }
        if (exponent == 1) {
            return base;
        }
        int halfPow = pow(base, exponent / 2);
        int result = (halfPow * halfPow) % 1337;
        if (exponent % 2 == 1) {
            result = (result * base) % 1337;
        }
        return result;
    }
}

The program defines a class named PowerModulus with a single public method superPow that takes two arguments a and b, and returns an integer value representing a^b % 1337.

The implementation of superPow starts by initializing mod to 1337, and result to 1. It then reduces a to its equivalent value mod mod to ensure that a is within the range of 0 to mod-1.

The program then iterates through the array b in reverse order using a for loop. For each element of b, it calculates partialResult as a^10 % mod, and then raises partialResult to the power of exponent using the pow method defined below.

The pow method is a recursive method that implements the exponentiation by squaring algorithm. It takes two arguments base and exponent, and returns an integer value representing base^exponent % 1337. If exponent is 0, it returns 1. If exponent is 1, it returns base. Otherwise, it calculates halfPow as pow(base, exponent / 2) and then computes result as (halfPow * halfPow) % 1337. If exponent is odd, it multiplies result by base and then reduces the result modulo 1337.

After computing result for the current element of b, the program multiplies result with the current value of result and reduces the result modulo 1337. It then calculates a to the power of 10 modulo 1337 to prepare for the next iteration of the loop.

Finally, the program returns the value of result as the answer to the problem.

Note that the program uses the fact that a^(b1b2) = (a^b1)^10 * (a^b2). This allows the program to break down the exponent b into its individual digits, and then compute the result using modular exponentiation.

The following test cases failed: Example 1: Input: a = 2, b = [3] Output: 8 Example 2: Input: a = 2, b = [1,0] Output: 1024

I apologize for the mistake in my previous response. The program I provided contains a bug in the calculation of partialResult, which results in incorrect output for some inputs. Here's the corrected Java program:

java

public class PowerModulus {
    public int superPow(int a, int[] b) {
        int mod = 1337;
        a = a % mod;
        int result = 1;
        for (int i = 0; i < b.length; i++) {
            result = pow(result, 10) % mod;
            result = (result * pow(a, b[i])) % mod;
        }
        return result;
    }

    private int pow(int base, int exponent) {
        int mod = 1337;
        if (exponent == 0) {
            return 1;
        }
        if (exponent == 1) {
            return base % mod;
        }
        int halfPow = pow(base, exponent / 2) % mod;
        int result = (halfPow * halfPow) % mod;
        if (exponent % 2 == 1) {
            result = (result * (base % mod)) % mod;
        }
        return result;
    }
}

The corrected program defines the same PowerModulus class with a single public method superPow that takes two arguments a and b, and returns an integer value representing a^b % 1337.

The implementation of superPow starts by initializing mod to 1337, and reducing a to its equivalent value mod mod to ensure that a is within the range of 0 to mod-1.

The program then iterates through the array b using a for loop. For each element of b, it raises a to the power of the current element using the pow method defined below. It then raises the current result to the power of 10 using the pow method and multiplies it with the result of the previous step. The final result is obtained by reducing the result modulo 1337.

The pow method is a recursive method that implements the exponentiation by squaring algorithm. It takes two arguments base and exponent, and returns an integer value representing base^exponent % 1337. If exponent is 0, it returns 1. If exponent is 1, it returns base modulo 1337. Otherwise, it calculates halfPow as pow(base, exponent / 2) % mod and then computes result as (halfPow * halfPow) % mod. If exponent is odd, it multiplies result by base modulo 1337.

The corrected program should correctly handle all inputs within the constraints specified in the problem statement.