# Count the nodes whose sum with X is a Fibonacci number

• Last Updated : 24 Sep, 2021

Given a tree, and the weights of all the nodes and an integer X, the task is to count all the nodes i such that (weight[i] + X) is a Fibonacci Number.
First, few Fibonacci numbers are:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 141, …

Examples:

Input: X = 5
Output:
Only the nodes 3 and 5 give a fibonacci number when 5 is added to them.
i.e. (3 + 5) = 8 and (16 + 5) = 21 are both Fibonacci numbers.

Approach: Perform dfs on the tree and count all the nodes sum of whose weight with x is a Fibonacci number.

Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach``#include ``using` `namespace` `std;` `int` `ans = 0, x;` `vector<``int``> graph;``vector<``int``> weight(100);` `// Function that returns true if``// x is a perfect square``bool` `isPerfectSquare(``long` `double` `x)``{``    ``// Find floating point value of``    ``// square root of x``    ``long` `double` `sr = ``sqrt``(x);` `    ``// If square root is an integer``    ``return` `((sr - ``floor``(sr)) == 0);``}` `// Function that returns true``// if n is a fibonacci number``bool` `isFibonacci(``int` `n)``{``    ``return` `isPerfectSquare(5 * n * n + 4)``           ``|| isPerfectSquare(5 * n * n - 4);``}` `// Function to perform dfs``void` `dfs(``int` `node, ``int` `parent)``{``    ``// If weight of the current node``    ``// gives a fibonacci number``    ``// when x is added to it``    ``if` `(isFibonacci(weight[node] + x))``        ``ans += 1;` `    ``for` `(``int` `to : graph[node]) {``        ``if` `(to == parent)``            ``continue``;``        ``dfs(to, node);``    ``}``}` `// Driver code``int` `main()``{``    ``x = 5;` `    ``// Weights of the node``    ``weight = 4;``    ``weight = 5;``    ``weight = 3;``    ``weight = 25;``    ``weight = 16;``    ``weight = 34;` `    ``// Edges of the tree``    ``graph.push_back(2);``    ``graph.push_back(3);``    ``graph.push_back(4);``    ``graph.push_back(5);``    ``graph.push_back(6);` `    ``dfs(1, 1);` `    ``cout << ans;` `    ``return` `0;``}`

## Java

 `// Java implementation of the``// above approach``import` `java.util.*;` `@SuppressWarnings``(``"unchecked"``)` `class` `GFG{``    ` `static` `int` `ans = ``0``, x;` `static` `ArrayList []graph = ``new` `ArrayList[``100``];``static` `ArrayList weight = ``new` `ArrayList();``  ` `// Function that returns true if``// x is a perfect square``static` `boolean` `isPerfectSquare(``double` `x)``{``  ` `  ``// Find floating point value of``  ``// square root of x``  ``double` `sr = Math.sqrt(x);``  ` `  ``// If square root is an integer``  ``return` `((sr - Math.floor(sr)) == ``0``);``}``  ` `// Function that returns true``// if n is a fibonacci number``static` `boolean` `isFibonacci(``int` `n)``{``  ``return` `isPerfectSquare(``5` `* n * n + ``4``) ||``         ``isPerfectSquare(``5` `* n * n - ``4``);``}``  ` `// Function to perform dfs``static` `void` `dfs(``int` `node, ``int` `parent)``{``  ` `  ``// If weight of the current node``  ``// gives a fibonacci number``  ``// when x is added to it``  ``if` `(isFibonacci((``int``)weight.get(node) + x))``    ``ans += ``1``;`` ` `  ``for``(``int` `to : (ArrayList)graph[node])``  ``{``    ``if` `(to == parent)``      ``continue``;``    ` `    ``dfs(to, node);``  ``}``}``  ` `// Driver Code``public` `static` `void` `main(String[] args)``{``  ``x = ``5``;``  ` `  ``for``(``int` `i = ``0``; i < ``100``; i++)``  ``{``    ``weight.add(``0``);``    ``graph[i] = ``new` `ArrayList();``  ``}``  ` `  ``// Weights of the node``  ``weight.add(``1``, ``4``);``  ``weight.add(``2``, ``5``);``  ``weight.add(``3``, ``3``);``  ``weight.add(``4``, ``25``);``  ``weight.add(``5``, ``16``);``  ``weight.add(``6``, ``34``);``  ` `  ``// Edges of the tree``  ``graph[``1``].add(``2``);``  ``graph[``2``].add(``3``);``  ``graph[``2``].add(``4``);``  ``graph[``1``].add(``5``);``  ``graph[``5``].add(``6``);`` ` `  ``dfs(``1``, ``1``);``  ` `  ``System.out.println(ans);``}``}` `// This code is contributed by pratham76`

## Python3

 `# Python3 implementation of the approach``import` `math``ans, x ``=` `0``, ``0`` ` `graph ``=` `[[] ``for` `i ``in` `range``(``100``)]``weight ``=` `[``0``]``*``(``100``)`` ` `# Function that returns true if``# x is a perfect square``def` `isPerfectSquare(x):``  ` `    ``# Find floating point value of``    ``# square root of x``    ``sr ``=` `math.sqrt(x);`` ` `    ``# If square root is an integer``    ``return` `((sr ``-` `math.floor(sr)) ``=``=` `0``)`` ` `# Function that returns true``# if n is a fibonacci number``def` `isFibonacci(n):``    ``return` `isPerfectSquare(``5` `*` `n ``*` `n ``+` `4``) ``or` `isPerfectSquare(``5` `*` `n ``*` `n ``-` `4``)`` ` `# Function to perform dfs``def` `dfs(node, parent):``    ``global` `ans``    ``# If weight of the current node``    ``# gives a fibonacci number``    ``# when x is added to it``    ``if` `(isFibonacci(weight[node] ``+` `x)):``        ``ans ``+``=` `1`` ` `    ``for` `to ``in` `graph[node]:``        ``if` `(to ``=``=` `parent):``            ``continue``        ``dfs(to, node)` `x ``=` `5`` ` `# Weights of the node``weight[``1``] ``=` `4``weight[``2``] ``=` `5``weight[``3``] ``=` `3``weight[``4``] ``=` `25``weight[``5``] ``=` `16``weight[``6``] ``=` `34` `# Edges of the tree``graph[``1``].append(``2``)``graph[``2``].append(``3``)``graph[``2``].append(``4``)``graph[``1``].append(``5``)``graph[``5``].append(``6``)` `dfs(``1``, ``1``)` `print``(ans)` `# This code is contributed by divyesh072019.`

## C#

 `// C# implementation of the``// above approach``using` `System;``using` `System.Collections;``class` `GFG{``     ` `static` `int` `ans = 0, x;``static` `ArrayList []graph = ``new` `ArrayList;``static` `ArrayList weight = ``new` `ArrayList();`` ` `// Function that returns true if``// x is a perfect square``static` `bool` `isPerfectSquare(``double` `x)``{``  ``// Find floating point value of``  ``// square root of x``  ``double` `sr = Math.Sqrt(x);` `  ``// If square root is an integer``  ``return` `((sr - Math.Floor(sr)) == 0);``}`` ` `// Function that returns true``// if n is a fibonacci number``static` `bool` `isFibonacci(``int` `n)``{``    ``return` `isPerfectSquare(5 * n * n + 4) ||``           ``isPerfectSquare(5 * n * n - 4);``}`` ` `// Function to perform dfs``static` `void` `dfs(``int` `node, ``int` `parent)``{``  ``// If weight of the current node``  ``// gives a fibonacci number``  ``// when x is added to it``  ``if` `(isFibonacci((``int``)weight[node] + x))``    ``ans += 1;` `  ``foreach` `(``int` `to ``in` `graph[node])``  ``{``    ``if` `(to == parent)``      ``continue``;``    ``dfs(to, node);``  ``}``}`` ` `// Driver Code``public` `static` `void` `Main(``string``[] args)``{``  ``x = 5;` `  ``for``(``int` `i = 0; i < 100; i++)``  ``{``    ``weight.Add(0);``    ``graph[i] = ``new` `ArrayList();``  ``}` `  ``// Weights of the node``  ``weight = 4;``  ``weight = 5;``  ``weight = 3;``  ``weight = 25;``  ``weight = 16;``  ``weight = 34;` `  ``// Edges of the tree``  ``graph.Add(2);``  ``graph.Add(3);``  ``graph.Add(4);``  ``graph.Add(5);``  ``graph.Add(6);` `  ``dfs(1, 1);``  ``Console.Write(ans);``}``}` `// This code is contributed by rutvik_56`

## Javascript

 ``

Output:

`2`

My Personal Notes arrow_drop_up