Skip to content
thecscience
THECSICENCE

Learn everything about computer science

  • Home
  • Human values
  • NCERT Solutions
  • HackerRank solutions
    • HackerRank Algorithms problems solutions
    • HackerRank C solutions
    • HackerRank C++ solutions
    • HackerRank Java problems solutions
    • HackerRank Python problems solutions
thecscience
THECSICENCE

Learn everything about computer science

HackerRank Kingdom Division Problem Solution

Yashwant Parihar, June 13, 2023August 1, 2024

In this post, we will solve HackerRank Kingdom Division Problem Solution.

King Arthur has a large kingdom that can be represented as a tree, where nodes correspond to cities and edges correspond to the roads between cities. The kingdom has a total of n cities numbered from 1 to n.

The King wants to divide his kingdom between his two children, Reggie and Betty, by giving each of them 0 or more cities; however, they don’t get along so he must divide the kingdom in such a way that they will not invade each other’s cities. The first sibling will invade the second sibling’s city if the second sibling has no other cities directly connected to it. For example, consider the kingdom configurations below:

Given a map of the kingdom’s n cities, find and print the number of ways King Arthur can divide it between his two children such that they will not invade each other. As this answer can be quite large, it must be modulo 10 power 9 +7.
Input Format
The first line contains a single integer denoting n (the number of cities in the kingdom). Each of the n – 1 subsequent lines contains two space-separated integers, u and v. describing a road connecting cities u and v.

Output Format
Print the number of ways to divide the kingdom such that the siblings will not invade each other, modulo 10 power 9 +7.

Sample Input

5
1 2
1 3
3 4
3 5

Sample Output

4

Explanation

In the diagrams below, red cities are ruled by Betty and blue cities are ruled by Reggie. The diagram below shows a division of the kingdom that results in war between the siblings.

Because cities 5 and 4 are not connected to any other red cities, blue city  will cut off their supplies and declare war on them. That said, there are four valid ways to divide the kingdom peacefully.

HackerRank Kingdom Division Problem Solution
HackerRank Kingdom Division Problem Solution

Kingdom Division C Solution

#include <stdio.h>
#include <stdlib.h>
#define MOD 1000000007
typedef struct _lnode
{
  int x;
  int w;
  struct _lnode *next;
}
 lnode;
void insert_edge(int x,int y,int w);
void dfs(int x,int y);
long long not_care[100000],safe[100000];
lnode *table[100000]={0};

int main()
{
  int n,x,y,i;
  scanf("%d",&n);
  for(i=0;i<n-1;i++)
  {
    scanf("%d%d",&x,&y);
    insert_edge(x-1,y-1,0);
  }
  dfs(0,-1);
  printf("%lld",safe[0]*2%MOD);
  return 0;
}
void insert_edge(int x,int y,int w)
{
  lnode *t=(lnode*)malloc(sizeof(lnode));
  t->x=y;
  t->w=w;
  t->next=table[x];
  table[x]=t;
  t=(lnode*)malloc(sizeof(lnode));
  t->x=x;
  t->w=w;
  t->next=table[y];
  table[y]=t;
  return;
}
void dfs(int x,int y)
{
  int f=0;
  long long not_safe=1;
  lnode *p;
  not_care[x]=1;
  for(p=table[x];p;p=p->next)
    if(p->x!=y){
      dfs(p->x,x);
      f=1;
      not_care[x]=(not_care[p->x]+safe[p->x])%MOD*not_care[x]%MOD;
      not_safe=not_safe*safe[p->x]%MOD;
    }
  if(!f)
    safe[x]=0;
  else
    safe[x]=(not_care[x]-not_safe+MOD)%MOD;
  return;
}

Kingdom Division C++ Solution

#pragma region H
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <iostream>
#include <unordered_map>
#include <cmath>
#include <map>
#include <ctime>
#include <set>
#include <stack>
#include <stdio.h>
#include <iomanip>
#include <functional>
#include <cmath>
#include <sstream>
#include <cstdlib>

#define X first
#define Y second
#define fid(n) for (int i = (n)-1;i>=0;i--)
#define fjd(n) for (int j = (n)-1;j>=0;j--)
#define fkd(n) for (int k = (n)-1;k>=0;k--)
#define fid1(n) for (int i = (n)-1;i>=1;i--)
#define fjd1(n) for (int j = (n)-1;j>=1;j--)
#define fkd1(n) for (int k = (n)-1;k>=1;k--)
#define fi(n) for (int i = 0;i<(n);i++)
#define fj(n) for (int j = 0;j<(n);j++)
#define fk(n) for (int k = 0;k<(n);k++)
#define fi1(n) for (int i = 1;i<(n);i++)
#define All(x) (x).begin(),(x).end()
#define rAll(x) (x).rbegin(),(x).rend()
typedef long long ll;
using namespace std;
template<class T>inline const T sqr(const T & x) { return x*x; }
ll gcd(ll a, ll b) { while (b) { a %= b; swap(a, b); }return a; }
ll lcm(ll a, ll b) { return a*b / gcd(a, b); }
ll popcnt(ll mask) { ll cnt = 0; while (mask) cnt += mask % 2, mask /= 2; return cnt; }
void pause()
{
#ifdef _DEBUG
	system("PAUSE");
#endif
}
ll powi(ll a, ll b, ll mod = 1000000007)
{
	if (b < 2) return b ? a : 1;
	return (powi((a*a) % mod, b / 2, mod)*(b % 2 ? a : 1LL)) % mod;
}
ll mod7 = 1000000007; ll mod9 = 1000000009;
#pragma endregion

const ll N = 100000 + 11;
vector<ll> g[N];
ll dp[N][2][2];
//vertex,parrent,self
void dfs(int v, int p)
{
	fi(2)fj(2) dp[v][i][j] = (i == j);
	ll o[2] = { 1,1 };
	for (auto to : g[v])if (to != p)
	{
		dfs(to, v);
	}
	for (auto to : g[v])if (to != p)
	{
		fi(2)
		{
			dp[v][i][i] *= (dp[to][i][0]+dp[to][i][1])%mod7;
			dp[v][i][i] %= mod7;
			o[i] *= dp[to][i][i ^ 1];
			o[i] %= mod7;
		}
	}
	fi(2)
	{
		dp[v][i ^ 1][i] = (dp[v][i][i]-o[i]+mod7)%mod7;
	}
}

int main(int argc, char* argv[]) {
	ios::sync_with_stdio(false);
#ifdef _DEBUG
	ifstream cin; cin.open("test.txt");
#endif
	ll n; cin >> n;
	fi(n - 1)
	{
		ll a, b; cin >> a >> b;
		a--; b--;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	dfs(0, -1);
	cout << (dp[0][0][1] + dp[0][1][0])%mod7 << endl;
	pause(); return 0;
}

Kingdom Division C Sharp Solution

using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Text.RegularExpressions;
using System.Text;
using System;
using System.Numerics;
class Result
{

    /*
     * Complete the 'kingdomDivision' function below.
     *
     * The function is expected to return an INTEGER.
     * The function accepts following parameters:
     *  1. INTEGER n
     *  2. 2D_INTEGER_ARRAY roads
     */

    private static List<List<int>> list;
        private static int[][][] mem;
        private static long mod;
        public static long kingdomDivision(int n, List<List<int>> roads)
        {
            mod = 1000000007;
            mem = new int[100005][][];
            for (int i = 0; i < 100005; i++)
            {
                mem[i] = new int[2][];
                for (int j = 0; j < 2; j++)
                {
                    mem[i][j] = new int[2];
                }
            }
            list = new List<List<int>>();
            for (int i = 0; i < n + 1; i++)
            {
                list.Add(new List<int>());
            }
            for (int i = 0; i < roads.Count; i++)
            {
                int a = roads[i][0];
                int b = roads[i][1];
                list[a].Add(b);
                list[b].Add(a);
            }
            return 2 * g(1, 0, 0, 0, 0) % mod;


        }

        private static long g(int node, int parent, int index, int color, int ally)
        {
            if (index == list[node].Count)
            {
                return ally;
            }

            int child = list[node][index];

            if (child == parent)
            {
                return g(node, parent, index + 1, color, ally);
            }

            if (mem[child][color][ally] != 0)
            {
                return mem[child][color][ally];
            }
            long res;
            res = g(child, node, 0, color, 1) * g(node, parent, index + 1, color, 1) % mod;
            res = res + g(child, node, 0, 1 - color, 0) * g(node, parent, index + 1, color, ally) % mod;
            mem[child][color][ally] = (int)res;
            return res;
        }

}

class Solution
{
    public static void Main(string[] args)
    {
        TextWriter textWriter = new StreamWriter(@System.Environment.GetEnvironmentVariable("OUTPUT_PATH"), true);

        int n = Convert.ToInt32(Console.ReadLine().Trim());

        List<List<int>> roads = new List<List<int>>();

        for (int i = 0; i < n - 1; i++)
        {
            roads.Add(Console.ReadLine().TrimEnd().Split(' ').ToList().Select(roadsTemp => Convert.ToInt32(roadsTemp)).ToList());
        }

        long result = Result.kingdomDivision(n, roads);

        textWriter.WriteLine(result);

        textWriter.Flush();
        textWriter.Close();
    }
}

Kingdom Division Java Solution

import java.util.*;

import java.io.*;



public class Solution{

    static final int MOD = 1_000_000_007;

    static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    

    public static void main(String args[]) throws IOException{

        int n = Integer.parseInt(reader.readLine());

        Node[] nodes = new Node[n];

        for(int e = 1; e < n; e++){

            int[] edge = Arrays.stream(reader.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();

            int u = edge[0];

            int v = edge[1];

            if(nodes[u - 1] == null){

                nodes[u - 1] = new Node(u);

            }

            if(nodes[v - 1] == null){

                nodes[v - 1] = new Node(v);

            }

            nodes[u - 1].add(nodes[v - 1]);

            nodes[v - 1].add(nodes[u - 1]);

        }

        System.out.println(Solution.solve(nodes[0]));

    }

    

    static long solve(Node root){

        LinkedList<Node> stack = new LinkedList<>();

        stack.add(0, root);

        while(!stack.isEmpty()){

            stack.peek().checkChild();

            if(stack.peek().isLeaf() || stack.peek().peekChild().hasWeight()){

                stack.poll().computeWeight();

                continue;

            }

            stack.add(0, stack.peek().nextChild());

        }

        return root.getWeight();

    }

    

    static class Node{

        Queue<Node> children;

        long color;

        long label;

        Node parent;

        

        public Node(int label){

            this.label = label;

            this.parent = null;

            this.children = new LinkedList<>();

            this.color = -1;

        }

        

        private long colorCombos(){

            if(this.isLeaf()){

                return 1;

            }

            long colorCombos = 1;

            for(Node child : this.children){

                long childCombos = (child.isLeaf()) ? child.color : child.getWeight();

                childCombos = (childCombos + child.negCombos()) % Solution.MOD;

                colorCombos = (colorCombos * childCombos) % Solution.MOD; 

            }

            return colorCombos;

        }

        

        private long negCombos(){

            if(this.isLeaf()){

                return 0;

            }

            long negCombos = 1;

            for(Node child : this.children){

                if(child.isLeaf()){

                    return 0;

                }

                negCombos = (negCombos * child.color) % Solution.MOD;

            }

            return negCombos;

        }

        

        public void add(Node child){

            this.children.add(child);

        }

        

        public void checkChild(){

            if(!this.isLeaf() && this.children.peek() == this.parent){

                this.children.poll();

            }

            if(!this.isLeaf()){

                this.children.peek().parent = this;

            }

        }

        

        public void computeWeight(){

            long colorCombos = this.colorCombos();

            long negCombos = this.negCombos();

            this.color = (colorCombos >= negCombos) ? colorCombos - negCombos : colorCombos + Solution.MOD - negCombos;

        }

        

        public long getWeight(){

            return (2 * this.color) % Solution.MOD;

        }

        

        public boolean hasWeight(){

            return this.color != -1;

        }

        

        public boolean isLeaf(){

            return this.children.isEmpty();

        }

        

        public Node nextChild(){

            this.checkChild();

            if(this.isLeaf()){

                return null;

            }

            Node child = this.children.poll();

            this.children.add(child);

            return child;

        }

        

        public Node peekChild(){

            this.checkChild();

            return (this.isLeaf()) ? null : this.children.peek();

        }

    }

}

Kingdom Division JavaScript Solution

'use strict';

const fs = require('fs');

process.stdin.resume();
process.stdin.setEncoding('utf-8');

let inputString = '';
let currentLine = 0;

process.stdin.on('data', inputStdin => {
    inputString += inputStdin;
});

process.stdin.on('end', _ => {
    inputString = inputString.replace(/\s*$/, '')
        .split('\n')
        .map(str => str.replace(/\s*$/, ''));

    main();
});

function readLine() {
    return inputString[currentLine++];
}

let nodes = {};

function getNode(n) {
    if ( n in nodes ) {
        return nodes[n];
    } else {
        let node = { 
            id: n, 
            parent: null, 
            children: [], 
            sibling: null, 
            peacecount: -1n, 
            quasicount: -1n 
        };
        nodes[n]=node;
        return node;
    }
}

function family(root) {
    let queue = [ root ];
    while ( queue.length>0 ) {
        let c=queue.shift();
        let prevchild = null;
        for ( let i=0; i<c.children.length; i++ ) {
            let child = c.children[i];
            child.parent = c;
            const index = child.children.indexOf(c);
            if (index > -1) {
                child.children.splice(index, 1);
            }
            if ( prevchild!=null ) {
                prevchild.sibling = child;
            }
            prevchild = child;
            queue.push(child);
        }
    }
}

function mktree(roads) {
    for (let i=0; i<roads.length; i++) {
        let [n0,n1] = roads[i].map(getNode);
        n0.children.push(n1);
        n1.children.push(n0);
    }
    let root = nodes[roads[0][0]];
    family(root);
    return root;
}

const M=1000000007n;

function devide(root) { //non recursive
    let c=root;
    while ( root.peacecount<0n ) {
        while (c.children.length>0) {
            c=c.children[0];
        }
        c.peacecount=0n;
        c.quasicount=1n;
        while ( c.sibling==null && c.parent!=null ) {
            c=c.parent;
            c.peacecount=1n;
            c.quasicount=1n;
            for (let i=0; i<c.children.length; i++ ) {
                let child = c.children[i];
                let [pc,qc] = [child.peacecount,child.quasicount];
                c.peacecount = (c.peacecount*(pc*2n+qc))%M;
                c.quasicount = (c.quasicount*pc)%M;
            }
            c.peacecount=(c.peacecount-c.quasicount+M)%M;
//            console.error(c.id,"=>",c.peacecount,c.quasicount);
        }
        c=c.sibling;
    }
    return (root.peacecount*2n)%M;
}

// Complete the kingdomDivision function below.
function kingdomDivision(n, roads) {
    return devide(mktree(roads));
}

function main() {
    const ws = fs.createWriteStream(process.env.OUTPUT_PATH);
    const n = parseInt(readLine(), 10);
    let roads = Array(n-1);
    for (let i = 0; i < n-1; i++) {
        roads[i] = readLine().split(' ').map(roadsTemp => parseInt(roadsTemp, 10));
    }
    let result = kingdomDivision(n, roads);
    ws.write(result + "\n");
    ws.end();
}

Kingdom Division Python Solution

#!/bin/python3

import sys

from collections import defaultdict, Counter, deque

# read the input, assembling graph
n = int(input())
edges = defaultdict(set)  # adjacency list
degree = Counter()  # node degree
for _ in range(n-1):
    u, v = map(int, input().split())
    edges[u].add(v)
    edges[v].add(u)
    degree[u] += 1
    degree[v] += 1

# The possible divisions for a sub-tree rooted @ node is
#   count[node][parent]
# where parent = True if the node shares its parent's color
count = {u: {True: 1, False: 1} for u in degree}

# We accumulate counts by iteratively stripping leaves from the tree
leaves = deque([u for u in degree if degree[u] == 1])
while True:
    node = leaves.popleft()

    # If parent differs, exclude case where ALL children differ
    count[node][False] = count[node][True] - count[node][False]

    # If no edges left, we have reached root and are done
    if not degree[node]:
        root = node
        break
    else:
        # Otherwise update parent:
        parent = edges[node].pop()

        # update topology
        edges[parent].discard(node)
        degree[parent] -= 1
        if degree[parent] == 1:
            leaves.append(parent)

        # update counts
        count[parent][True] *= count[node][True] + count[node][False]
        count[parent][False] *= count[node][False]

# Note each division has a corresponding one with colors switched
total = 2 * count[root][0]
print(total % (10**9 + 7))
c C# C++ HackerRank Solutions java javascript python CcppCSharpHackerrank Solutionsjavajavascriptpython

Post navigation

Previous post
Next post
  • HackerRank Dynamic Array Problem Solution
  • HackerRank 2D Array – DS Problem Solution
  • Hackerrank Array – DS Problem Solution
  • Von Neumann and Harvard Machine Architecture
  • Development of Computers
©2025 THECSICENCE | WordPress Theme by SuperbThemes