📌  相关文章
📜  查找(a ^ b)%m,其中“ a”非常大

📅  最后修改于: 2021-04-24 15:32:52             🧑  作者: Mango

给定三个数字a,b和m,其中1 <= b,m <= 10 ^ 6和’a’可能非常大,最多包含10 ^ 6个数字。任务是找到(a ^ b)%m。

例子:

Input  : a = 3, b = 2, m = 4
Output : 1
Explanation : (3^2)%4 = 9%4 = 1

Input : a = 987584345091051645734583954832576, b = 3, m = 11
Output: 10

这个问题基本上是基于模块化算法的。我们可以将(a ^ b)%m写为(a%m)*(a%m)*(a%m)*…(a%m),b倍。以下是解决此问题的算法:

  • 由于’a’非常大,因此将’a’读为字符串。
  • 现在我们尝试减少“ a”。我们对“ a”取模m一次,即; ans = a%m,现在ans = a%m位于1到10 ^ 6的整数范围内,即; 1 <= a%m <= 10 ^ 6。
  • 现在将ans乘以b-1倍,并同时用m乘以中间乘法结果的mod,因为ans的中间乘法可能会超出整数范围,并且会产生错误的答案。
C++
// C++ program to find (a^b) mod m for a large 'a'
#include
using namespace std;
 
// utility function to calculate a%m
unsigned int aModM(string s, unsigned int mod)
{
    unsigned int number = 0;
    for (unsigned int i = 0; i < s.length(); i++)
    {
        // (s[i]-'0') gives the digit value and form
        // the number
        number = (number*10 + (s[i] - '0'));
        number %= mod;
    }
    return number;
}
 
// Returns find (a^b) % m
unsigned int ApowBmodM(string &a, unsigned int b,
                                  unsigned int m)
{
    // Find a%m
    unsigned int ans = aModM(a, m);
    unsigned int mul = ans;
 
    // now multiply ans by b-1 times and take
    // mod with m
    for (unsigned int i=1; i


Java
// Java program to find (a^b) mod m for a large 'a'
 
public class GFG {
     
    // utility function to calculate a%m
    static int aModM(String s, int mod)
    {
        int number = 0;
        for (int i = 0; i < s.length(); i++)
        {
             
            // (s[i]-'0') gives the digit
            // value and form the number
            number = (number * 10 );
            int x = Character.getNumericValue(s.charAt(i));
            number = number + x;
            number %= mod;
        }
         
        return number;
    }
 
    // Returns find (a^b) % m
    static int ApowBmodM(String a, int b, int m)
    {
         
        // Find a%m
        int ans = aModM(a, m);
        int mul = ans;
     
        // now multiply ans by b-1 times
        // and take mod with m
        for (int i = 1; i < b; i++)
            ans = (ans * mul) % m;
     
        return ans;
    }
 
    // Driver code
    public static void main(String args[])
    {
        String a = "987584345091051645734583954832576";
        int b = 3, m = 11;
        System.out.println(ApowBmodM(a, b, m));
    }
}
 
// This code is contributed by Sam007


Python
# Python program to find (a^b) mod m for a large 'a'
def aModM(s, mod):
    number = 0
 
    # convert string s[i] to integer which gives
    # the digit value and form the number
    for i in range(len(s)):
        number = (number*10 + int(s[i]))
        number = number % m
 
    return number
 
# Returns find (a^b) % m
def ApowBmodM(a, b, m):
 
    # Find a%m   
    ans = aModM(a, m)
    mul = ans
 
    # now multiply ans by b-1 times and take
    # mod with m
    for i in range(1,b):
        ans = (ans*mul) % m
         
    return ans
 
 
# Driver program to run the case
a = "987584345091051645734583954832576"
b, m = 3, 11
print ApowBmodM(a, b, m)


C#
// C# program to find (a^b) mod m
// for a large 'a'
using System;
 
class GFG {
     
// utility function to calculate a%m
static int aModM(string s, int mod)
{
    int number = 0;
    for (int i = 0; i < s.Length; i++)
    {
         
        // (s[i]-'0') gives the digit
        // value and form the number
        number = (number * 10 );
        int x = (int)(s[i] - '0');
        number = number + x;
        number %= mod;
    }
    return number;
}
 
// Returns find (a^b) % m
static int ApowBmodM(string a, int b,
                              int m)
{
     
    // Find a%m
    int ans = aModM(a, m);
    int mul = ans;
 
    // now multiply ans by b-1 times
    // and take mod with m
    for (int i = 1; i < b; i++)
        ans = (ans * mul) % m;
 
    return ans;
}
 
// Driver Code
public static void Main()
{
    string a = "987584345091051645734583954832576";
    int b=3, m=11;
    Console.Write(ApowBmodM(a, b, m));
     
}
}
 
// This code is contributed by Sam007


PHP


Javascript


输出:

10