{- |
How many possibilities are there for representing an amount of n ct
by the Euro coins 1ct, 2ct, 5ct, 10ct, 20ct, 50ct, 100ct, 200ct?
-}
module Combinatorics.Coin where

import qualified Data.List as List
import qualified PowerSeries as PS


values :: [Int]
values :: [Int]
values = Int
1 forall a. a -> [a] -> [a]
: Int
2 forall a. a -> [a] -> [a]
: Int
5 forall a. a -> [a] -> [a]
: Int
10 forall a. a -> [a] -> [a]
: Int
20 forall a. a -> [a] -> [a]
: Int
50 forall a. a -> [a] -> [a]
: Int
100 forall a. a -> [a] -> [a]
: Int
200 forall a. a -> [a] -> [a]
: []

representationNumbersSingle :: Int -> [Integer]
representationNumbersSingle :: Int -> [Integer]
representationNumbersSingle Int
n =
   forall a. [a] -> [a]
cycle (Integer
1 forall a. a -> [a] -> [a]
: forall a. Int -> a -> [a]
List.replicate (Int
nforall a. Num a => a -> a -> a
-Int
1) Integer
0)

representationNumbers :: [Integer]
representationNumbers :: [Integer]
representationNumbers =
   forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl forall a. Num a => [a] -> [a] -> [a]
PS.mul forall a. Num a => T a
PS.one forall a b. (a -> b) -> a -> b
$
   forall a b. (a -> b) -> [a] -> [b]
map Int -> [Integer]
representationNumbersSingle [Int]
values