Given an infinite tree and three numbers N, M, and X which has exactly N child from every node. Every edge has a weight of 1, 2, 3, 4..N. The task is to find the count of paths whose weight is exactly X and has a minimum of one edge of weight M in it.

The diagram above shows a tree shown till level-3 and N = 3.

**Examples:**

**Input:** N = 3, M = 2, X = 3
**Output:** 2
The path 1-2 and 2-1 in the image above
**Input: ** N = 2, M = 1, X = 4
**Output: ** 4

**Approach:** The problem can be solved using Dynamic Programming and memoization. We will use a top-down approach to solve this problem. Recur starting from the root with sum initially as X, and recursively traverse all paths possible( which is from 1 to N). If the node is equal to M, then the second parameter becomes true, else it stays the same which has been passed in the previous call. Store the value in a DP[][] table to avoid visiting same states twice.

Below is the implementation of the above approach.

# Python3 program to count the number of paths

Max = 4

c = 2

# Function to find the number of paths

def countPaths(Sum, get, m, n, dp):

# If the Summation is more than X

if (Sum < 0):
return 0
# If exactly X weights have reached
if (Sum == 0):
return get
# Already visited
if (dp[Sum][get] != -1):
return dp[Sum][get]
# Count paths
res = 0
# Traverse in all paths
for i in range(1, n + 1):
# If the edge weight is M
if (i == m):
res += countPaths(Sum - i, 1, m, n, dp)
else: # Edge's weight is not M
res += countPaths(Sum - i, get, m, n, dp)
dp[Sum][get] = res
return dp[Sum][get]
# Driver Code
n = 3
m = 2
x = 3
dp = [[-1 for i in range(2)]
for i in range(Max + 1)]
# Initialized the DP array with -1
for i in range(Max + 1):
for j in range(2):
dp[i][j] = -1
# Function to count paths
print(countPaths(x, 0, m, n, dp))
# This code is contributed by Mohit kumar 29
[tabbyending]

Striver(underscore)79 at Codechef and codeforces D

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.