#practiceLinkDiv { display: ingen !viktigt; }Givet tre siffror a b och m där 1<=bm<=10^6 och 'a' kan vara mycket stor och innehåller upp till 10^6 siffror. Uppgiften är att hitta (a^b)%m .
Exempel:
vad är undantagshantering i java
Input : a = 3 b = 2 m = 4 Output : 1 Explanation : (3^2)%4 = 9%4 = 1 Input : a = 987584345091051645734583954832576 b = 3 m = 11 Output: 10Recommended Practice Hitta (a^b)%m Prova!
Detta problem är i grunden baserat på modulär aritmetik. Vi kan skriva (a^b) % m som (a%m) * (a%m) * (a%m) * ... (a%m) b gånger . Nedan finns en algoritm för att lösa detta problem:
- Eftersom 'a' är väldigt stort så läs 'a' som sträng.
- Nu försöker vi minska 'a'. Vi tar modulo av 'a' med m en gång, dvs. ans = a % m på detta sätt nu ans=a%m ligger mellan heltalsområde 1 till 10^6, dvs. 1<= a%m <= 10^6.
- Multiplicera nu år av b-1 gånger och samtidigt ta mod av mellanliggande multiplikation resultat med m eftersom mellanliggande multiplikation av år kan överskrida intervallet för heltal och det kommer att ge fel svar.
// 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<b; i++) ans = (ans*mul) % m; return ans; } // Driver program to run the case int main() { string a = '987584345091051645734583954832576'; unsigned int b=3 m=11; cout << ApowBmodM(a b m); return 0; }
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
Python3 # 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(1b): 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 // PHP program to find (a^b) // mod m for a large 'a' // utility function to // calculate a%m function aModM($s $mod) { $number = 0; for ($i = 0; $i < strlen($s); $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 function 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 = 1; $i < $b; $i++) $ans = ($ans * $mul) % $m; return $ans; } // Driver code $a = '987584345091051645734583954832576'; $b = 3; $m = 11; echo ApowBmodM($a $b $m); return 0; // This code is contributed by nitin mittal. ?> JavaScript <script> // JavaScript program to find (a^b) mod m // for a large 'a' // Utility function to calculate a%m function aModM(s mod) { let number = 0; for(let i = 0; i < s.length; i++) { // (s[i]-'0') gives the digit // value and form the number number = (number * 10 ); let x = (s[i] - '0'); number = number + x; number %= mod; } return number; } // Returns find (a^b) % m function ApowBmodM(a b m) { // Find a%m let ans = aModM(a m); let mul = ans; // Now multiply ans by b-1 times // and take mod with m for(let i = 1; i < b; i++) ans = (ans * mul) % m; return ans; } // Driver Code let a = '987584345091051645734583954832576'; let b = 3 m = 11; document.write(ApowBmodM(a b m)); // This code is contributed by souravghosh0416 </script>
Produktion
10
Tidskomplexitet: O(endast(a)+b)
Hjälputrymme: O(1)
Effektivt tillvägagångssätt: Ovanstående multiplikationer kan reduceras till log b genom att använda snabb modulär exponentiering där vi beräknar resultatet genom den binära representationen av exponenten (b) . Om den inställda biten är 1 vi multiplicerar det aktuella värdet av basen till resultatet och kvadrerar värdet på basen för varje rekursivt anrop.
Rekursiv kod:
C++14// C++ program to find (a^b) mod m for a large 'a' with an // efficient approach. #include using namespace std; typedef long long ll; // Reduce the number B to a small number // using Fermat Little ll MOD(string num int mod) { ll res = 0; for (int i = 0; i < num.length(); i++) res = (res * 10 + num[i] - '0') % mod; return res; } ll ModExponent(ll a ll b ll m) { ll result; if (a == 0) return 0; else if (b == 0) return 1; else if (b & 1) { result = a % m; result = result * ModExponent(a b - 1 m); } else { result = ModExponent(a b / 2 m); result = ((result * result) % m + m) % m; } return (result % m + m) % m; } int main() { // String input as b is very large string a = '987584345091051645734583954832576'; // String input as b is very large ll b = 3; ll m = 11; ll remainderA = MOD(a m); cout << ModExponent(remainderA b m); return 0; }
Java // Java program to find (a^b) mod m for a large 'a' with an // efficient approach. public class GFG { // Reduce the number B to a small number // using Fermat Little static long MOD(String num long mod) { long res = 0; for (int i = 0; i < num.length(); i++) { res = (res * 10 + num.charAt(i) - '0') % mod; } return res; } // Calculate the ModExponent of the given large number // 'a' static long ModExponent(long a long b long m) { long result; if (a == 0) { return 0; } else if (b == 0) { return 1; } else if (b % 2 != 0) { result = a % m; result = result * ModExponent(a b - 1 m); } else { result = ModExponent(a b / 2 m); result = ((result * result) % m + m) % m; } return (result % m + m) % m; } public static void main(String[] args) { // String input as a is very large String a = '987584345091051645734583954832576'; long b = 3; long m = 11; long remainderA = MOD(a m); System.out.println(ModExponent(remainderA b m)); } } // The code is contributed by Gautam goel (gautamgoel962)
Python3 # Python3 program to find (a^b) mod m # for a large 'a' # Utility function to calculate a%m def MOD(s mod): res = 0 for i in range(len(s)): res = (res * 10 + int(s[i])) % mod return res # Returns find (a^b) % m def ModExponent(a b m): if (a == 0): return 0 elif (b == 0): return 1 elif (b % 2 != 0): result = a % m result = result * ModExponent(a b - 1 m) else: result = ModExponent(a b / 2 m) result = ((result * result) % m + m) % m return (result % m + m) % m # Driver Code a = '987584345091051645734583954832576' b = 3 m = 11 remainderA = MOD(a m) print(ModExponent(remainderA b m)) # This code is contributed by phasing17
C# // C# program to find (a^b) mod m for a large 'a' with an // efficient approach. using System; using System.Collections.Generic; public class GFG { // Reduce the number B to a small number // using Fermat Little static long MOD(string num long mod) { long res = 0; for (int i = 0; i < num.Length; i++) { res = (res * 10 + num[i] - '0') % mod; } return res; } // Calculate the ModExponent of the given large number // 'a' static long ModExponent(long a long b long m) { long result; if (a == 0) { return 0; } else if (b == 0) { return 1; } else if (b % 2 != 0) { result = a % m; result = result * ModExponent(a b - 1 m); } else { result = ModExponent(a b / 2 m); result = ((result * result) % m + m) % m; } return (result % m + m) % m; } // Driver Code public static void Main(string[] args) { // String input as a is very large string a = '987584345091051645734583954832576'; long b = 3; long m = 11; // Function Call long remainderA = MOD(a m); Console.WriteLine(ModExponent(remainderA b m)); } } // The code is contributed by phasing17
JavaScript <script> // JavaScript program to find (a^b) mod m // for a large 'a' // Utility function to calculate a%m function MOD(s mod) { var res = 0; for (var i = 0; i < s.length; i++) { res = (res * 10 + (s[i] - '0')) % mod; } return res; } // Returns find (a^b) % m function ModExponent(a b m) { var result; if (a == 0) { return 0; } else if (b == 0) { return 1; } else if (b % 2 != 0) { result = a % m; result = result * ModExponent(a b - 1 m); } else { result = ModExponent(a b / 2 m); result = ((result * result) % m + m) % m; } return (result % m + m) % m; } // Driver Code let a = '987584345091051645734583954832576'; let b = 3 m = 11; var remainderA = MOD(a m); document.write(ModExponent(remainderA b m)); // This code is contributed by shinjanpatra. </script>
Produktion
10
Tidskomplexitet: O(len(a)+ log b)
Hjälputrymme: O(logb)
Rymdeffektiv iterativ kod:
kvartal under åretC++14
// C++ program to find (a^b) mod m for a large 'a' #include using namespace std; typedef long long ll; // utility function to calculate a%m and b%m ll aModM(string s ll mod) { ll number = 0; for (ll 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 ll ApowBmodM(ll x ll yll m) { ll res=1; while(y) { if(y&1) res=(res*x)%m; y=y>>1; x=((x*x)%m+m)%m; } return (res%m+m)%m; } // Driver program to run the case int main() { string a = '987584345091051645734583954832576'; ll b=3; ll m=11; // Find a%m ll x=aModM(am); cout << ApowBmodM(xbm); return 0; }
Java // Java program to find (a^b) mod m for a large 'a' import java.util.*; class GFG { // utility function to calculate a%m and b%m static long aModM(String s long mod) { long number = 0; for (int i = 0; i < s.length(); i++) { // (s[i]-'0') gives the digit value and form // the number number = (number * 10 + (s.charAt(i) - '0')); number %= mod; } return number; } // Returns find (a^b) % m static long ApowBmodM(long x long y long m) { long res = 1; while (y > 0) { if ((y & 1) != 0) res = (res * x) % m; y = y >> 1; x = ((x * x) % m + m) % m; } return (res % m + m) % m; } // Driver program to run the case public static void main(String[] args) { String a = '987584345091051645734583954832576'; long b = 3; long m = 11; // Find a%m long x = aModM(a m); System.out.println(ApowBmodM(x b m)); } } // This code is contributed by phasing17
Python3 # Python3 program to find (a^b) mod m for a large 'a' # utility function to calculate a%m and b%m def aModM(s mod): number = 0; for i in range(len(s)): # int(s[i]) gives the digit value and form # the number number = (number * 10 + int(s[i])); number %= mod; return number; # Returns find (a^b) % m def ApowBmodM(x y m): res = 1; while (y > 0): if (y & 1): res = (res * x) % m; y = y >> 1; x = ((x * x) % m + m) % m; return (res % m + m) % m; # Driver program to run the case a = '987584345091051645734583954832576'; b = 3; m = 11; # Find a%m x = aModM(a m); print(ApowBmodM(x b m)); # This code is contributed by phasing17
C# // C# program to find (a^b) mod m for a large 'a' using System; class GFG { // utility function to calculate a%m and b%m static long aModM(string s long mod) { long number = 0; for (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 static long ApowBmodM(long x long y long m) { long res = 1; while (y > 0) { if ((y & 1) != 0) res = (res * x) % m; y = y >> 1; x = ((x * x) % m + m) % m; } return (res % m + m) % m; } // Driver program to run the case public static void Main(string[] args) { string a = '987584345091051645734583954832576'; long b = 3; long m = 11; // Find a%m long x = aModM(a m); Console.WriteLine(ApowBmodM(x b m)); } } // This code is contributed by phasing17
JavaScript // JavaScript program to find (a^b) mod m for a large 'a' // utility function to calculate a%m and b%m function aModM(s mod) { let number = 0; for (var i = 0; i < s.length; i++) { // parseInt(s[i]) gives the digit value and form // the number number = (number * 10 + parseInt(s[i])); number %= mod; } return number; } // Returns find (a^b) % m function ApowBmodM(x y m) { let res = 1; while (y) { if (y & 1) res = (res * x) % m; y = y >> 1; x = ((x * x) % m + m) % m; } return (res % m + m) % m; } // Driver program to run the case let a = '987584345091051645734583954832576'; let b = 3; let m = 11; // Find a%m let x = aModM(a m); console.log(ApowBmodM(x b m)); // This code is contributed by phasing17
Produktion
10
Tidskomplexitet: O(len(a)+ log b)
Hjälputrymme: O(1)
Fall: När både 'a' och 'b' är mycket stora.
Vi kan också implementera samma tillvägagångssätt om båda 'a' och 'b' var mycket stor. I så fall hade vi först tagit mot av det med m använder vår aModM fungera. Skicka det sedan till ovanstående ApowBmodM rekursiv eller iterativ funktion för att få önskat resultat.
Rekursiv kod:
C++14#include using namespace std; typedef long long ll; // Reduce the number B to a small number // using Fermat Little ll MOD(string numint mod) { ll res=0; for(int i=0;i<num.length();i++) res=(res*10+num[i]-'0')%mod; return res; } ll ModExponent(ll all bll m) { ll result; if(a==0) return 0; else if(b==0) return 1; else if(b&1) { result=a%m; result=result*ModExponent(ab-1m); } else{ result=ModExponent(ab/2m); result=((result%m)*(result%m))%m; } return (result%m+m)%m; } int main() { // String input as b is very large string a = '987584345091051645734583954832576'; // String input as b is very large string b = '467687655456765756453454365476765'; ll m = 1000000007; ll remainderA = MOD(am); ll remainderB = MOD(bm); cout << ModExponent(remainderA remainderB m); return 0; }
Java /*package whatever //do not write package name here */ import java.io.*; class GFG { // Reduce the number B to a small number // using Fermat Little. static long MOD(String numint mod) { long res = 0; for(int i = 0; i < num.length(); i++) { res = (res * 10 + num.charAt(i) - '0') % mod; } return res; } static long ModExponent(long along blong m){ long result = 0; if(a == 0) return 0; else if(b == 0) return 1; else if((b&1) == 1){ result = a % m; result = result*ModExponent(a b - 1 m); } else{ result = ModExponent(a b/2 m); result = ((result % m)*(result % m)) % m; } return (result % m + m) % m; } public static void main (String[] args) { // String input as b is very large String a = '987584345091051645734583954832576'; // String input as b is very large String b = '467687655456765756453454365476765'; int m = 1000000007; long remainderA = MOD(am); long remainderB = MOD(bm); System.out.println(ModExponent(remainderA remainderB m)); } } // This code is contributed by aadityapburujwale
Python3 # Python3 program to implement the approach # Reduce the number B to a small number # using Fermat Little def MOD(num mod): res = 0; for i in range(len(num)): res = (res * 10 + int(num[i])) % mod; return res; def ModExponent(a b m): if (a == 0): return 0; elif (b == 0): return 1; elif (b & 1): result = a % m; result = result * ModExponent(a b - 1 m); else: b = b // 2 result = ModExponent(a b m); result = ((result % m) * (result % m)) % m; return (result % m + m) % m; # String input as b is very large a = '987584345091051645734583954832576'; # String input as b is very large b = '467687655456765756453454365476765'; m = 1000000007; remainderA = (MOD(a m)); remainderB = (MOD(b m)); print(ModExponent(remainderA remainderB m)); # This code is contributed by phasing17
C# // C# program to implement the approach using System; using System.Collections.Generic; class GFG { // Reduce the number B to a small number // using Fermat Little. static long MOD(string num int mod) { long res = 0; for (int i = 0; i < num.Length; i++) { res = (res * 10 + num[i] - '0') % mod; } return res; } static long ModExponent(long a long b long m) { long result = 0; if (a == 0) return 0; else if (b == 0) return 1; else if ((b & 1) == 1) { result = a % m; result = result * ModExponent(a b - 1 m); } else { result = ModExponent(a b / 2 m); result = ((result % m) * (result % m)) % m; } return (result % m + m) % m; } public static void Main(string[] args) { // String input as b is very large string a = '987584345091051645734583954832576'; // String input as b is very large string b = '467687655456765756453454365476765'; int m = 1000000007; long remainderA = MOD(a m); long remainderB = MOD(b m); Console.WriteLine( ModExponent(remainderA remainderB m)); } } // This code is contributed by phasing17
JavaScript // JavaScript program to implement the approach // Reduce the number B to a small number // using Fermat Little function MOD(num mod) { let res = 0; for (var i = 0; i < num.length; i++) res = (res * 10 + parseInt(num[i])) % mod; return res; } function ModExponent(a b m) { let result; if (a == 0n) return 0n; else if (b == 0n) return 1n; else if (b & 1n) { result = a % m; result = result * ModExponent(a b - 1n m); } else { b = b / 2n - (b % 2n); result = ModExponent(a b m); result = ((result % m) * (result % m)) % m; } return (result % m + m) % m; } // String input as b is very large let a = '987584345091051645734583954832576'; // String input as b is very large let b = '467687655456765756453454365476765'; let m = 1000000007; let remainderA = BigInt(MOD(a m)); let remainderB = BigInt(MOD(b m)); console.log(ModExponent(remainderA remainderB BigInt(m))); // This code is contributed by phasing17
Produktion
546081867
Tidskomplexitet: O(len(a)+len(b)+log b)
Hjälputrymme: O(logb)
Rymdeffektiv iterativ kod:
C++14// C++ program to find (a^b) mod m for a large 'a' #include using namespace std; typedef long long ll; // utility function to calculate a%m and b%m ll aModM(string s ll mod) { ll number = 0; for (ll 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 ll ApowBmodM(string& a string& b ll m) { ll res = 1; // Find a%m ll x = aModM(a m); // Find b%m ll y = aModM(b m); while (y) { if (y & 1) res = (res * x) % m; y = y >> 1; x = ((x % m) * (x % m)) % m; } return (res % m + m) % m; } // Driver program to run the case int main() { string a = '987584345091051645734583954832576'; string b = '467687655456765756453454365476765'; ll m = 1000000007; cout << ApowBmodM(a b m); return 0; }
Java /*package whatever //do not write package name here */ import java.io.*; class GFG { // utility function to calculate a%m and b%m static long aModM(String s long mod){ long number = 0; for (int i = 0; i < s.length(); i++) { // (s.charAt(i)-'0') gives the digit value and form // the number number = (number * 10 + (s.charAt(i) - '0')); number %= mod; } return number; } // Returns find (a^b) % m static long ApowBmodM(String a String b long m) { long res = 1; // Find a%m long x = aModM(a m); // Find b%m long y = aModM(b m); while (y>0) { if ((y & 1)==1) res = (res * x) % m; y = y >> 1; x = ((x % m) * (x % m)) % m; } return (res % m + m) % m; } public static void main (String[] args) { String a = '987584345091051645734583954832576'; String b = '467687655456765756453454365476765'; long m = 1000000007; System.out.println(ApowBmodM(a b m)); } } // This code is contributed by aadityapburujwale
Python3 # Python3 program to find (a^b) mod m for a large 'a' # utility function to calculate a%m and b%m def aModM(s mod): number = 0 for i in range(len(s)): # (s[i]-'0') gives the digit value and form # the number number = (number * 10 + (int(s[i]))) number %= mod return number # Returns find (a^b) % m def ApowBmodM(a b m): res = 1 # Find a%m x = aModM(a m) # Find b%m y = aModM(b m) while (y > 0): if (y & 1): res = (res * x) % m y = y >> 1 x = ((x % m) * (x % m)) % m return (res % m + m) % m # Driver program to run the case a = '987584345091051645734583954832576' b = '467687655456765756453454365476765' m = 1000000007 print(ApowBmodM(a b m)) # This code is contributed by phasing17
JavaScript // JavaScript program to find (a^b) mod m for a large 'a' // utility function to calculate a%m and b%m function aModM(s mod) { let number = 0n; for (let i = 0; i < s.length; i++) { // (s[i]-'0') gives the digit value and form // the number number = (number * 10n + BigInt(parseInt(s[i]))); number %= mod; } return number; } // Returns find (a^b) % m function ApowBmodM(a b m) { let res = 1n; // Find a%m let x = BigInt(aModM(a m)); // Find b%m let y = BigInt(aModM(b m)); while (y > 0n) { if (y & 1n) res = (res * x) % m; y = y >> 1n; x = ((x % m) * (x % m)) % m; } return (res % m + m) % m; } // Driver program to run the case let a = '987584345091051645734583954832576'; let b = '467687655456765756453454365476765'; let m = 1000000007n; console.log(ApowBmodM(a b m)); // This code is contributed by phasing17
C# // C# program to find (a^b) mod m for a large 'a' using System; using System.Collections.Generic; class GFG { // utility function to calculate a%m and b%m static long aModM(string s long mod) { long number = 0; for (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 static long ApowBmodM(string a string b long m) { long res = 1; // Find a%m long x = aModM(a m); // Find b%m long y = aModM(b m); while (y != 0) { if ((y & 1) != 0) res = (res * x) % m; y = y >> 1; x = ((x % m) * (x % m)) % m; } return (res % m + m) % m; } // Driver program to run the case public static void Main(string[] args) { string a = '987584345091051645734583954832576'; string b = '467687655456765756453454365476765'; long m = 1000000007; Console.WriteLine(ApowBmodM(a b m)); } } // This code is contributed by phasing17
Produktion
546081867
Tidskomplexitet: O(len(a)+len(b)+ log b)
Hjälputrymme: O(1)
Om du vill GeeksforGeeks och vill bidra kan du också skriva en artikel med hjälp av write.geeksforgeeks.org eller maila din artikel till [email protected].
java sträng klassSkapa frågesport