Различные степени числа N такие, что сумма равна K
Учитывая два числа N и K , задача состоит в том, чтобы вывести различные степени N, которые используются для получения суммы K. Если это невозможно, выведите -1 .
Примеры:
Input: N = 3, K = 40
Output: 0, 1, 2, 3
Explanation:
The value of N is 3.
30 + 31 + 32 + 33 = 40
Input: N = 4, K = 65
Output: 0, 3
The value of N is 4.
40 + 43 = 65
Input: N = 4, K = 18
Output: -1
Explanation:
It’s impossible to get 18 by adding the powers of 4.
Наблюдение: одно наблюдение, которое необходимо сделать для любого произвольного числа a, состоит в том, что не может существовать числа больше, чем K, если все степени a от 0 до k-1 складываются с использованием каждой степени хотя бы один раз.
Пример: Пусть a = 3 и K = 4. Тогда:
34 = 81.
30 + 31 + 32 + 33 = 40 which is less than 81(34).
Naive Approach: By using the above observation, the naive approach can be formed. The idea is to continuously subtract the highest power of N not exceeding K from K until K reaches 0. If at any instance, K becomes equal to some power which was already subtracted from it previously, then it’s not possible to get the sum equal to K. Therefore, an array is used to keep a track of powers that have been subtracted from K.
Below is the implementation of the above approach:
C++
// C++ implementation to find distinct// powers of N that add upto K#include <bits/stdc++.h>using namespace std;// Function to return the highest power// of N not exceeding Kint highestPower(int n, int k){ int i = 0; int a = pow(n, i); // Loop to find the highest power // less than K while (a <= k) { i += 1; a = pow(n, i); } return i - 1;}// Initializing the PowerArray// with all 0"s.int b[50] = { 0 };// Function to print// the distinct powers of N// that add upto Kint PowerArray(int n, int k){ while (k) { // Getting the highest // power of n before k int t = highestPower(n, k); // To check if the power // is being used twice or not if (b[t]) { // Print -1 if power // is being used twice cout << -1; return 0; } else // If the power is not visited, // then mark the power as visited b[t] = 1; // Decrementing the value of K k -= pow(n, t); } // Printing the powers of N // that sum up to K for (int i = 0; i < 50; i++) { if (b[i]) { cout << i << ", "; } }}// Driver codeint main(){ int N = 3; int K = 40; PowerArray(N, K); return 0;} |
Java
// Java implementation to find distinct// powers of N that add upto Kclass GFG{ // Function to return the highest power// of N not exceeding Kstatic int highestPower(int n, int k){ int i = 0; int a = (int) Math.pow(n, i); // Loop to find the highest power // less than K while (a <= k) { i += 1; a = (int) Math.pow(n, i); } return i - 1;} // Initializing the PowerArray// with all 0"s.static int b[] = new int[50]; // Function to print// the distinct powers of N// that add upto Kstatic int PowerArray(int n, int k){ while (k>0) { // Getting the highest // power of n before k int t = highestPower(n, k); // To check if the power // is being used twice or not if (b[t]>0) { // Print -1 if power // is being used twice System.out.print(-1); return 0; } else // If the power is not visited, // then mark the power as visited b[t] = 1; // Decrementing the value of K k -= Math.pow(n, t); } // Printing the powers of N // that sum up to K for (int i = 0; i < 50; i++) { if (b[i] > 0) { System.out.print(i+ ", "); } } return 0;} // Driver codepublic static void main(String[] args){ int N = 3; int K = 40; PowerArray(N, K);}}// This code contributed by Rajput-Ji |
Python3
# Python 3 implementation to find distinct# powers of N that add up to Kfrom math import pow# Function to return the highest power# of N not exceeding Kdef highestPower(n,k): i = 0 a = pow(n, i) # Loop to find the highest power # less than K while (a <= k): i += 1 a = pow(n, i) return i - 1# Initializing the PowerArray# with all 0"s.b = [0 for i in range(50)]# Function to print# the distinct powers of N# that add upto Kdef PowerArray(n, k): while (k): # Getting the highest # power of n before k t = highestPower(n, k) # To check if the power # is being used twice or not if (b[t]): # Print -1 if power # is being used twice print(-1) return 0 else: # If the power is not visited, # then mark the power as visited b[t] = 1 # Decrementing the value of K k -= pow(n, t) # Printing the powers of N # that sum up to K for i in range(50): if (b[i]): print(i,end = ", ")# Driver codeif __name__ == "__main__": N = 3 K = 40 PowerArray(N, K) # This code is contributed by Surendra_Gangwar |
C#
// C# implementation to find distinct// powers of N that add up to Kusing System;public class GFG{// Function to return the highest power// of N not exceeding Kstatic int highestPower(int n, int k){ int i = 0; int a = (int) Math.Pow(n, i); // Loop to find the highest power // less than K while (a <= k) { i += 1; a = (int) Math.Pow(n, i); } return i - 1;}// Initializing the PowerArray// with all 0"s.static int []b = new int[50];// Function to print// the distinct powers of N// that add upto Kstatic int PowerArray(int n, int k){ while (k > 0) { // Getting the highest // power of n before k int t = highestPower(n, k); // To check if the power // is being used twice or not if (b[t] > 0) { // Print -1 if power // is being used twice Console.Write(-1); return 0; } else // If the power is not visited, // then mark the power as visited b[t] = 1; // Decrementing the value of K k -= (int)Math.Pow(n, t); } // Printing the powers of N // that sum up to K for (int i = 0; i < 50; i++) { if (b[i] > 0) { Console.Write(i+ ", "); } } return 0;}// Driver codepublic static void Main(String[] args){ int N = 3; int K = 40; PowerArray(N, K);}}// This code is contributed by 29AjayKumar |
Javascript
<script>// Javascript implementation to find distinct// powers of N that add upto K// Function to return the highest power// of N not exceeding Kfunction highestPower(n, k){ let i = 0; let a = Math.pow(n, i); // Loop to find the highest power // less than K while (a <= k) { i += 1; a = Math.pow(n, i); } return i - 1;} // Initializing the PowerArray// with all 0"s.let b = Array.from({length: 50}, (_, i) => 0); // Function to print// the distinct powers of N// that add upto Kfunction PowerArray(n, k){ while (k>0) { // Getting the highest // power of n before k let t = highestPower(n, k); // To check if the power // is being used twice or not if (b[t]>0) { // Prlet -1 if power // is being used twice document.write(-1); return 0; } else // If the power is not visited, // then mark the power as visited b[t] = 1; // Decrementing the value of K k -= Math.pow(n, t); } // Prleting the powers of N // that sum up to K for (let i = 0; i < 50; i++) { if (b[i] > 0) { document.write(i+ ", "); } } return 0;}// Driver Code let N = 3; let K = 40; PowerArray(N, K); </script> |
0, 1, 2, 3,
Сложность времени: O ((log N) 2 )
- Время, затраченное на то, чтобы узнать силу, - это Журнал (N) .
- Кроме того, для K используется еще один цикл Log (N).
- Итак, общая временная сложность Log (N) 2
Эффективный подход: можно сделать еще одно наблюдение : для того, чтобы K было суммой мощностей N, которые можно использовать только один раз, K% N должен быть либо 1, либо 0 (1 из-за N 0 ). Следовательно, если ( K% N ) выходит что-либо, кроме 0 или 1, можно сделать вывод, что невозможно получить сумму K.
Следовательно, используя приведенное выше наблюдение, можно выполнить следующие шаги для вычисления ответа:
- Сначала счетчик инициализируется 0.
- Если (K% N) = 0 , то счетчик увеличивается на 1, а K обновляется до K / N.
- Если K% N = 1 , то частотный массив f [count] увеличивается на 1, а K обновляется до K - 1 .
- Если в какой-то момент f [count] окажется больше 1, тогда верните -1 (потому что одну и ту же мощность нельзя использовать дважды).
Below is the implementation of the above approach:
C++
// C++ implementation to find out// the powers of N that add upto K#include <bits/stdc++.h>using namespace std;// Initializing the PowerArray// with all 0"sint b[50] = { 0 };// Function to find the powers of N// that add up to Kint PowerArray(int n, int k){ // Initializing the counter int count = 0; // Executing the while // loop until K is // greater than 0 while (k) { if (k % n == 0) { k /= n; count++; } // If K % N == 1, // then the power array // is incremented by 1 else if (k % n == 1) { k -= 1; b[count]++; // Checking if any power is // occurred more than once if (b[count] > 1) { cout << -1; return 0; } } // For any other value, the sum of // powers cannot be added up to K &nb
РЕКОМЕНДУЕМЫЕ СТАТЬИ |