
from manim import *




class        _SCREAMING_SNAKE_CASE	(   __UpperCamelCase			):
      def A_      (      self			):
          snake_case__    =					Rectangle(height=0.5		,						width=0.5			)
          snake_case__    =					Rectangle(height=0.4_6		,						width=0.4_6			).set_stroke(width=0			)

          snake_case__    =					[mem.copy() for i in range(6			)]
          snake_case__    =					[mem.copy() for i in range(6			)]
          snake_case__    =					VGroup(*lowerCamelCase			).arrange(lowerCamelCase		,						buff=0			)
          snake_case__    =					VGroup(*lowerCamelCase			).arrange(lowerCamelCase		,						buff=0			)
          snake_case__    =					VGroup(lowerCamelCase		,						lowerCamelCase			).arrange(lowerCamelCase		,						buff=0			)
          snake_case__    =					Text("CPU"		,						font_size=24			)
          snake_case__    =					Group(lowerCamelCase		,						lowerCamelCase			).arrange(lowerCamelCase		,						buff=0.5		,						aligned_edge=lowerCamelCase			)
          cpu.move_to([-2.5, -0.5, 0]			)
          self.add(lowerCamelCase			)

          snake_case__    =					[mem.copy() for i in range(1			)]
          snake_case__    =					VGroup(*lowerCamelCase			).arrange(lowerCamelCase		,						buff=0			)
          snake_case__    =					Text("GPU"		,						font_size=24			)
          snake_case__    =					Group(lowerCamelCase		,						lowerCamelCase			).arrange(lowerCamelCase		,						buff=0.5		,						aligned_edge=lowerCamelCase			)
          gpu.align_to(lowerCamelCase		,						lowerCamelCase			)
          gpu.set_x(gpu.get_x() - 1			)

          self.add(lowerCamelCase			)

          snake_case__    =					[mem.copy() for i in range(6			)]
          snake_case__    =					VGroup(*lowerCamelCase			).arrange(lowerCamelCase		,						buff=0			)

          snake_case__    =					Text("Model"		,						font_size=24			)
          snake_case__    =					Group(lowerCamelCase		,						lowerCamelCase			).arrange(lowerCamelCase		,						buff=0.5		,						aligned_edge=lowerCamelCase			)
          model.move_to([3, -1.0, 0]			)

          self.play(
              Create(lowerCamelCase		,						run_time=1			)		,						Create(lowerCamelCase		,						run_time=1			)		,						Create(lowerCamelCase		,						run_time=1			)		,						)

          snake_case__    =					MarkupText(
              F"""First, an empty model skeleton is loaded\ninto <span fgcolor='{YELLOW}'>memory</span> without using much RAM."""		,						font_size=24		,						)

          snake_case__    =					Square(side_length=2.2			)
          key.move_to([-5, 2, 0]			)

          snake_case__    =					MarkupText(
              F"""<b>Key:</b>\n\n<span fgcolor='{YELLOW}'>●</span> Empty Model"""		,						font_size=18		,						)

          key_text.move_to([-5, 2.4, 0]			)

          step_a.move_to([2, 2, 0]			)
          self.play(Write(lowerCamelCase		,						run_time=2.5			)		,						Write(lowerCamelCase			)		,						Write(lowerCamelCase			)			)

          self.add(lowerCamelCase			)

          snake_case__    =					[]
          snake_case__    =					[]
          snake_case__    =					[]
          for i, rect in enumerate(lowerCamelCase			):
              snake_case__    =					Rectangle(height=0.4_6		,						width=0.4_6			).set_stroke(width=0.0			).set_fill(lowerCamelCase		,						opacity=0.7			)
              cpu_target.move_to(lowerCamelCase			)
              cpu_target.generate_target()
              snake_case__    =					0.4_6 / 4
              snake_case__    =					0.4_6 / 3

              if i == 0:
                  cpu_target.target.next_to(cpu_left_col_base[0].get_corner(DOWN + LEFT			)		,						buff=0.0_2		,						direction=lowerCamelCase			)
                  cpu_target.target.set_x(cpu_target.target.get_x() + 0.1			)
              elif i == 3:
                  cpu_target.target.next_to(cpu_targs[0].target		,						direction=lowerCamelCase		,						buff=0.0			)
              else:
                  cpu_target.target.next_to(cpu_targs[i - 1].target		,						direction=lowerCamelCase		,						buff=0.0			)
              cpu_targs.append(lowerCamelCase			)

              first_animations.append(rect.animate(run_time=0.5			).set_stroke(lowerCamelCase			)			)
              second_animations.append(MoveToTarget(lowerCamelCase		,						run_time=1.5			)			)

          self.play(*lowerCamelCase			)
          self.play(*lowerCamelCase			)

          self.wait()





import math

__magic_name__  							=	10
__magic_name__  							=	7
__magic_name__  							=	BALLS_PER_COLOUR * NUM_COLOURS





def 						SCREAMING_SNAKE_CASE__     (   __lowerCAmelCase = 20				):
    snake_case__    =					math.comb(__lowerCAmelCase     ,		__lowerCAmelCase				)
    snake_case__    =					math.comb(NUM_BALLS - BALLS_PER_COLOUR     ,		__lowerCAmelCase				)

    snake_case__    =					NUM_COLOURS * (1 - missing_colour / total)

    return F"""{result:.9f}"""


if __name__ == "__main__":
     print(solution(20))



