# project-euler / project-euler / 155 / euler-155.pl

 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50``` ```#!/usr/bin/perl use strict; use warnings; use Math::BigRat; =begin explation. An electric circuit uses exclusively identical capacitors of the same value C. The capacitors can be connected in series or in parallel to form sub-units, which can then be connected in series or in parallel with other capacitors or other sub-units to form larger sub-units, and so on up to a final circuit. Using this simple procedure and up to n identical capacitors, we can make circuits having a range of different total capacitances. For example, using up to n=3 capacitors of 60 F each, we can obtain the following 7 distinct total capacitance values: If we denote by D(n) the number of distinct total capacitance values we can obtain when using up to n equal-valued capacitors and the simple procedure described above, we have: D(1)=1, D(2)=3, D(3)=7 ... Find D(18). Reminder : When connecting capacitors C1, C2 etc in parallel, the total capacitance is CT = C1 + C2 +..., whereas when connecting them in series, the overall capacitance is given by: =end =cut my @c; \$c[1] = ['1/1']; for my \$d (2 .. 18) { my %h; for my \$first (1 .. int(\$d/2)) { my \$second = \$d-\$first; for my \$f_key (@{\$c[\$first]}) { my \$f = Math::BigRat->new(\$f_key); for my \$s_key (@{\$c[\$second]}) { my \$s = Math::BigRat->new(\$s_key); for my \$t (\$f+\$s, (1/(1/\$f+1/\$s))) { \$h{\$t.''}++; } } } } \$c[\$d] = [keys(%h)]; print "Reached Depth \$d : Got " . scalar(@{\$c[\$d]}). "\n"; } ```