



"""simple docstring"""






# Author: OMKAR PATHAK, Nwachukwu Chidiebere

# Use a Python dictionary to construct the graph.
from __future__ import annotations

from pprint import pformat
from typing import Generic, TypeVar

lowerCAmelCase__      =    TypeVar('''T''')






class 	__snake_case	(     Generic[T]):




  def __init__(			self					:						List[Any]						, __lowerCAmelCase					:						bool = True		):






         """simple docstring"""






         _lowerCamelCase						:    dict[T, list[T]]         =			{}  # dictionary of lists
         _lowerCamelCase						:    int         =			directed




  def 						SCREAMING_SNAKE_CASE    (			self					:						List[str]						, __lowerCAmelCase					:						T						, __lowerCAmelCase					:						T		):






         """simple docstring"""






         if not self.directed:  # For undirected graphs
                # if both source vertex and destination vertex are both present in the
                # adjacency list, add destination vertex to source vertex list of adjacent
                # vertices and add source vertex to destination vertex list of adjacent
                # vertices.
                if source_vertex in self.adj_list and destination_vertex in self.adj_list:
                       self.adj_list[source_vertex].append(__lowerCAmelCase		)
                       self.adj_list[destination_vertex].append(__lowerCAmelCase		)
                # if only source vertex is present in adjacency list, add destination vertex
                # to source vertex list of adjacent vertices, then create a new vertex with
                # destination vertex as key and assign a list containing the source vertex
                # as it's first adjacent vertex.
                elif source_vertex in self.adj_list:
                       self.adj_list[source_vertex].append(__lowerCAmelCase		)
                       _lowerCamelCase						:    List[Any]         =			[source_vertex]
                # if only destination vertex is present in adjacency list, add source vertex
                # to destination vertex list of adjacent vertices, then create a new vertex
                # with source vertex as key and assign a list containing the source vertex
                # as it's first adjacent vertex.
                elif destination_vertex in self.adj_list:
                       self.adj_list[destination_vertex].append(__lowerCAmelCase		)
                       _lowerCamelCase						:    Union[str, Any]         =			[destination_vertex]
                # if both source vertex and destination vertex are not present in adjacency
                # list, create a new vertex with source vertex as key and assign a list
                # containing the destination vertex as it's first adjacent vertex also
                # create a new vertex with destination vertex as key and assign a list
                # containing the source vertex as it's first adjacent vertex.
                else:
                       _lowerCamelCase						:    int         =			[destination_vertex]
                       _lowerCamelCase						:    List[str]         =			[source_vertex]
         else:  # For directed graphs
                # if both source vertex and destination vertex are present in adjacency
                # list, add destination vertex to source vertex list of adjacent vertices.
                if source_vertex in self.adj_list and destination_vertex in self.adj_list:
                       self.adj_list[source_vertex].append(__lowerCAmelCase		)
                # if only source vertex is present in adjacency list, add destination
                # vertex to source vertex list of adjacent vertices and create a new vertex
                # with destination vertex as key, which has no adjacent vertex
                elif source_vertex in self.adj_list:
                       self.adj_list[source_vertex].append(__lowerCAmelCase		)
                       _lowerCamelCase						:    Optional[int]         =			[]
                # if only destination vertex is present in adjacency list, create a new
                # vertex with source vertex as key and assign a list containing destination
                # vertex as first adjacent vertex
                elif destination_vertex in self.adj_list:
                       _lowerCamelCase						:    Tuple         =			[destination_vertex]
                # if both source vertex and destination vertex are not present in adjacency
                # list, create a new vertex with source vertex as key and a list containing
                # destination vertex as it's first adjacent vertex. Then create a new vertex
                # with destination vertex as key, which has no adjacent vertex
                else:
                       _lowerCamelCase						:    Any         =			[destination_vertex]
                       _lowerCamelCase						:    Optional[Any]         =			[]

         return self




  def __repr__(			self					:						int		):






         """simple docstring"""






         return pformat(self.adj_list		)







"""simple docstring"""






def 	snake_case_  (				A_ :		int						):


       '''simple docstring'''





       return 1 if digit in (0, 1) else (digit * factorial(digit - 1						))






def 	snake_case_  (				A_ :		int						):


       '''simple docstring'''





       _lowerCamelCase						:    str         =			0
       _lowerCamelCase						:    Any         =			number
       while duplicate > 0:
              _lowerCamelCase      ,   _lowerCamelCase						:    Union[str, Any]         =			divmod(A_,    10						)
              fact_sum += factorial(A_						)
       return fact_sum == number


if __name__ == "__main__":
   print('''Program to check whether a number is a Krisnamurthy Number or not.''')
   lowerCAmelCase__      =    int(input('''Enter number: ''').strip())
   print(
       F"""{number} is {"" if krishnamurthy(number) else "not "}a Krishnamurthy Number."""
   )


