



# 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

UpperCAmelCase   :							str							 =TypeVar("""T""")


class       _lowercase   (Generic[T]      ):
				'''simple docstring'''







				def __init__( self     , snake_case__ = True    ):

									'''simple docstring'''


									UpperCamelCase_		  =   {}  # dictionary of lists
									UpperCamelCase_		  =   directed

				def       _lowerCamelCase					( self     , snake_case__     , snake_case__    ):

									'''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(snake_case__    )
																			self.adj_list[destination_vertex].append(snake_case__    )
														# 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(snake_case__    )
																			UpperCamelCase_		  =   [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(snake_case__    )
																			UpperCamelCase_		  =   [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:
																			UpperCamelCase_		  =   [destination_vertex]
																			UpperCamelCase_		  =   [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(snake_case__    )
														# 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(snake_case__    )
																			UpperCamelCase_		  =   []
														# 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:
																			UpperCamelCase_		  =   [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:
																			UpperCamelCase_		  =   [destination_vertex]
																			UpperCamelCase_		  =   []

									return self

				def __repr__( self    ):

									'''simple docstring'''


									return pformat(self.adj_list    )





from __future__ import annotations



def    _lowerCAmelCase    (_lowerCAmelCase   ,	_lowerCAmelCase):
					if nth_term == "":
										return [""]
					UpperCamelCase_		  =   int(_lowerCAmelCase)
					UpperCamelCase_		  =   int(_lowerCAmelCase)
					UpperCamelCase_		  =   []
					for temp in range(int(_lowerCAmelCase)):
										series.append(f"""1 / {pow(temp + 1   ,	int(_lowerCAmelCase))}""" if series else "1")
					return series


if __name__ == "__main__":
	import doctest

	doctest.testmod()

	UpperCAmelCase   :							Dict							 =int(input("""Enter the last number (nth term) of the P-Series"""))
	UpperCAmelCase   :							Union[str, Any]							 =int(input("""Enter the power for  P-Series"""))
	print("""Formula of P-Series => 1+1/2^p+1/3^p ..... 1/n^p""")
	print(p_series(nth_term, power))
