给定三个数字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