Given three integers X, Y and Z, the task is to find the sum of all the numbers formed having 4 at most X times, 5 at most Y times, and 6 at most Z times, under mod 10^9+7.
Examples:
Input: X = 1, Y = 1, Z = 1 Output: 3675 Explanation: 4 + 5 + 6 + 45 + 54 + 56 + 65 + 46 + 64 + 456 + 465 + 546 + 564 + 645 + 654 = 3675 Input: X = 4, Y = 5, Z = 6 Output: 129422134
Approach:
- As this problem has the property of sub-problems overlapping and optimal sub-structure, hence dynamic programming can be used to solve it.
- The numbers having exact i 4s, j 5s, and k 6s for all i < x, j < y, j < z are required to get the required sum.
- Therefore the DP array exactnum[i][j][k] will store the exact count of numbers having exact i 4s, j 5s, and k 6s.
- If exactnum[i – 1][j][k], exactnum[i][j – 1][k] and exactnum[i][j][k – 1] are already known, then it can be observed that the sum of these is the required answer, except in the case when exactnum[i – 1][j][k], exactnum[i][j – 1][k] or exactnum[i][j][k – 1] doesn’t exist. In that case, just skip it.
- exactsum[i][j][k] stores the sum of the exact number having i 4’s, j 5’s, and k 6’s in the same way as
exactsum[i][j][k] = 10 * (exactsum[i - 1][j][k]
+ exactsum[i][j - 1][k]
+ exactsum[i][j][k - 1])
+ 4 * exactnum[i - 1][j][k]
+ 5 * exactnum[i][j - 1][k]
+ 6 * exactnum[i][j][k - 1]
Below is the implementation of the above approach:
C++
// C++ program to find sum of all numbers// formed having 4 atmost X times, 5 atmost// Y times and 6 atmost Z times#include <bits/stdc++.h>using namespace std;const int N = 101;const int mod = 1e9 + 7;// exactsum[i][j][k] stores the sum of// all the numbers having exact// i 4's, j 5's and k 6'sint exactsum[N][N][N];// exactnum[i][j][k] stores numbers// of numbers having exact// i 4's, j 5's and k 6'sint exactnum[N][N][N];// Utility function to calculate the// sum for x 4's, y 5's and z 6'sint getSum(int x, int y, int z){ int ans = 0; exactnum[0][0][0] = 1; for (int i = 0; i <= x; ++i) { for (int j = 0; j <= y; ++j) { for (int k = 0; k <= z; ++k) { // Computing exactsum[i][j][k] // as explained above if (i > 0) { exactsum[i][j][k] += (exactsum[i - 1][j][k] * 10 + 4 * exactnum[i - 1][j][k]) % mod; exactnum[i][j][k] += exactnum[i - 1][j][k] % mod; } if (j > 0) { exactsum[i][j][k] += (exactsum[i][j - 1][k] * 10 + 5 * exactnum[i][j - 1][k]) % mod; exactnum[i][j][k] += exactnum[i][j - 1][k] % mod; } if (k > 0) { exactsum[i][j][k] += (exactsum[i][j][k - 1] * 10 + 6 * exactnum[i][j][k - 1]) % mod; exactnum[i][j][k] += exactnum[i][j][k - 1] % mod; } ans += exactsum[i][j][k] % mod; ans %= mod; } } } return ans;}// Driver codeint main(){ int x = 1, y = 1, z = 1; cout << (getSum(x, y, z) % mod); return 0;} |
Java
// Java program to find sum of all numbers // formed having 4 atmost X times, 5 atmost // Y times and 6 atmost Z times class GFG { static int N = 101; static int mod = (int)1e9 + 7; // exactsum[i][j][k] stores the sum of // all the numbers having exact // i 4's, j 5's and k 6's static int exactsum[][][] = new int[N][N][N]; // exactnum[i][j][k] stores numbers // of numbers having exact // i 4's, j 5's and k 6's static int exactnum[][][] = new int[N][N][N]; // Utility function to calculate the // sum for x 4's, y 5's and z 6's static int getSum(int x, int y, int z) { int ans = 0; exactnum[0][0][0] = 1; for (int i = 0; i <= x; ++i) { for (int j = 0; j <= y; ++j) { for (int k = 0; k <= z; ++k) { // Computing exactsum[i][j][k] // as explained above if (i > 0) { exactsum[i][j][k] += (exactsum[i - 1][j][k] * 10 + 4 * exactnum[i - 1][j][k]) % mod; exactnum[i][j][k] += exactnum[i - 1][j][k] % mod; } if (j > 0) { exactsum[i][j][k] += (exactsum[i][j - 1][k] * 10 + 5 * exactnum[i][j - 1][k]) % mod; exactnum[i][j][k] += exactnum[i][j - 1][k] % mod; } if (k > 0) { exactsum[i][j][k] += (exactsum[i][j][k - 1] * 10 + 6 * exactnum[i][j][k - 1]) % mod; exactnum[i][j][k] += exactnum[i][j][k - 1] % mod; } ans += exactsum[i][j][k] % mod; ans %= mod; } } } return ans; } // Driver code public static void main (String[] args) { int x = 1, y = 1, z = 1; System.out.println(getSum(x, y, z) % mod); } }// This code is contributed by AnkitRai01 |
Python3
# Python3 program to find sum of all numbers # formed having 4 atmost X times, 5 atmost # Y times and 6 atmost Z times import numpy as npN = 101; mod = int(1e9) + 7; # exactsum[i][j][k] stores the sum of # all the numbers having exact # i 4's, j 5's and k 6's exactsum = np.zeros((N, N, N)); # exactnum[i][j][k] stores numbers # of numbers having exact # i 4's, j 5's and k 6's exactnum = np.zeros((N, N, N)); # Utility function to calculate the # sum for x 4's, y 5's and z 6's def getSum(x, y, z) : ans = 0; exactnum[0][0][0] = 1; for i in range(x + 1) : for j in range(y + 1) : for k in range(z + 1) : # Computing exactsum[i][j][k] # as explained above if (i > 0) : exactsum[i][j][k] += (exactsum[i - 1][j][k] * 10 + 4 * exactnum[i - 1][j][k]) % mod; exactnum[i][j][k] += exactnum[i - 1][j][k] % mod; if (j > 0) : exactsum[i][j][k] += (exactsum[i][j - 1][k] * 10+ 5 * exactnum[i][j - 1][k]) % mod; exactnum[i][j][k] += exactnum[i][j - 1][k] % mod; if (k > 0) : exactsum[i][j][k] += (exactsum[i][j][k - 1] * 10 + 6 * exactnum[i][j][k - 1]) % mod; exactnum[i][j][k] += exactnum[i][j][k - 1] % mod; ans += exactsum[i][j][k] % mod; ans %= mod; return ans; # Driver code if __name__ == "__main__" : x = 1; y = 1; z = 1; print((getSum(x, y, z) % mod)); # This code is contributed by AnkitRai01 |
C#
// C# program to find sum of all numbers // formed having 4 atmost X times, 5 atmost // Y times and 6 atmost Z times using System;class GFG { static int N = 101; static int mod = (int)1e9 + 7; // exactsum[i][j][k] stores the sum of // all the numbers having exact // i 4's, j 5's and k 6's static int [,,]exactsum = new int[N, N, N]; // exactnum[i][j][k] stores numbers // of numbers having exact // i 4's, j 5's and k 6's static int [,,]exactnum= new int[N, N, N]; // Utility function to calculate the // sum for x 4's, y 5's and z 6's static int getSum(int x, int y, int z) { int ans = 0; exactnum[0, 0, 0] = 1; for (int i = 0; i <= x; ++i) { for (int j = 0; j <= y; ++j) { for (int k = 0; k <= z; ++k) { // Computing exactsum[i, j, k] // as explained above if (i > 0) { exactsum[i, j, k] += (exactsum[i - 1, j, k] * 10 + 4 * exactnum[i - 1, j, k]) % mod; exactnum[i, j, k] += exactnum[i - 1, j, k] % mod; } if (j > 0) { exactsum[i, j, k] += (exactsum[i, j - 1, k] * 10 + 5 * exactnum[i, j - 1, k]) % mod; exactnum[i, j, k] += exactnum[i, j - 1, k] % mod; } if (k > 0) { exactsum[i, j, k] += (exactsum[i, j, k - 1] * 10 + 6 * exactnum[i, j, k - 1]) % mod; exactnum[i, j, k] += exactnum[i, j, k - 1] % mod; } ans += exactsum[i, j, k] % mod; ans %= mod; } } } return ans; } // Driver code public static void Main () { int x = 1, y = 1, z = 1; Console.WriteLine(getSum(x, y, z) % mod); } } // This code is contributed by AnkitRai01 |
Javascript
<script> // Javascript program to find sum of all numbers // formed having 4 atmost X times, 5 atmost // Y times and 6 atmost Z times let N = 101; let mod = 1e9 + 7; // exactsum[i][j][k] stores the sum of // all the numbers having exact // i 4's, j 5's and k 6's let exactsum = new Array(N); // exactnum[i][j][k] stores numbers // of numbers having exact // i 4's, j 5's and k 6's let exactnum = new Array(N); for(let i = 0; i < N; i++) { exactsum[i] = new Array(N); exactnum[i] = new Array(N); for(let j = 0; j < N; j++) { exactsum[i][j] = new Array(N); exactnum[i][j] = new Array(N); for(let k = 0; k < N; k++) { exactsum[i][j][k] = 0; exactnum[i][j][k] = 0; } } } // Utility function to calculate the // sum for x 4's, y 5's and z 6's function getSum(x, y, z) { let ans = 0; exactnum[0][0][0] = 1; for (let i = 0; i <= x; ++i) { for (let j = 0; j <= y; ++j) { for (let k = 0; k <= z; ++k) { // Computing exactsum[i][j][k] // as explained above if (i > 0) { exactsum[i][j][k] += (exactsum[i - 1][j][k] * 10 + 4 * exactnum[i - 1][j][k]) % mod; exactnum[i][j][k] += exactnum[i - 1][j][k] % mod; } if (j > 0) { exactsum[i][j][k] += (exactsum[i][j - 1][k] * 10 + 5 * exactnum[i][j - 1][k]) % mod; exactnum[i][j][k] += exactnum[i][j - 1][k] % mod; } if (k > 0) { exactsum[i][j][k] += (exactsum[i][j][k - 1] * 10 + 6 * exactnum[i][j][k - 1]) % mod; exactnum[i][j][k] += exactnum[i][j][k - 1] % mod; } ans += exactsum[i][j][k] % mod; ans %= mod; } } } return ans; } let x = 1, y = 1, z = 1; document.write(getSum(x, y, z) % mod);</script> |
3675
Time Complexity: O(x*y*z)
Auxiliary Space: O(N3)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

… [Trackback]
[…] Find More Information here to that Topic: geeksforgeeks.org/sum-of-all-numbers-formed-having-4-atmost-x-times-5-atmost-y-times-and-6-atmost-z-times/ […]
… [Trackback]
[…] Here you can find 99554 more Info to that Topic: geeksforgeeks.org/sum-of-all-numbers-formed-having-4-atmost-x-times-5-atmost-y-times-and-6-atmost-z-times/ […]