open System
open System.Collections .Generic
let recip =
let cache = Dictionary< _, _> ( )
fun n m ->
if cache.ContainsKey ( ( n, m) ) then cache.[ ( n, m) ]
else
let res = List.find ( fun a -> n * a % m = 1 ) [ 1 ..( m - 1 ) ]
cache.[ ( n, m) ] <- res
res
let rec binomialMod n k m =
if k = 1 then n % m
else
let prev = binomialMod ( n - 1 ) ( k - 1 ) m
prev * n * ( recip k m) % m
let isPrime n =
List.exists ( fun i -> n % i = 0 ) [ 2 ..( n - 1 ) ]
let primes = List.filter isPrime [ 1000 ..5000 ]
let binomials = List.map ( fun m -> binomialMod ( int ( 1000000000000L % ( int64 m) ) ) 1000000000 ) primes
let solution =
let rec recSolution ( binomials: ( 'int list)) product chosen =
seq {
if binomials.IsEmpty then 0
else if chosen = 3 then yield product
else
yield! recSolution binomials.Tail product chosen
yield recSolution binomials.Tail (product * binomials.Head) (chosen + 1)
}
Seq.sum(recSolution binomials 1 0)
Console.WriteLine solution
b3BlbiBTeXN0ZW0Kb3BlbiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYyAKIApsZXQgcmVjaXAgPQogIGxldCBjYWNoZSA9IERpY3Rpb25hcnk8XywgXz4oKQogIGZ1biBuIG0gLT4KICAgICAgaWYgY2FjaGUuQ29udGFpbnNLZXkoIChuLCBtKSApIHRoZW4gY2FjaGUuWyAobiwgbSkgXQogICAgICBlbHNlIAogICAgICAgIGxldCByZXMgPSBMaXN0LmZpbmQgKGZ1biBhIC0+IG4gKiBhICUgbSA9IDEpIFsxLi4obSAtIDEpXQogICAgICAgIGNhY2hlLlsgKG4sIG0pIF0gPC0gcmVzCiAgICAgICAgcmVzCiAgICAgICAgCmxldCByZWMgYmlub21pYWxNb2QgbiBrIG0gID0KICBpZiBrID0gMSB0aGVuIG4gJSBtCiAgZWxzZSAKICAgIGxldCBwcmV2ID0gYmlub21pYWxNb2QgKG4gLSAxKSAoayAtIDEpIG0KICAgIHByZXYgKiBuICogKHJlY2lwIGsgbSkgJSBtCiAgICAKbGV0IGlzUHJpbWUgbiA9CiAgTGlzdC5leGlzdHMgKGZ1biBpIC0+IG4gJSBpID0gMCkgWzIuLihuIC0gMSldCiAgICAKbGV0IHByaW1lcyA9IExpc3QuZmlsdGVyIGlzUHJpbWUgWzEwMDAuLjUwMDBdCmxldCBiaW5vbWlhbHMgPSBMaXN0Lm1hcCAoZnVuIG0gLT4gYmlub21pYWxNb2QgKGludCAoMTAwMDAwMDAwMDAwMEwgJSAoaW50NjQgbSkpKSAxMDAwMDAwMDAwKSBwcmltZXMKCmxldCBzb2x1dGlvbiA9CiAgbGV0IHJlYyByZWNTb2x1dGlvbiAoYmlub21pYWxzOignaW50IGxpc3QpKSBwcm9kdWN0IGNob3NlbiA9CiAgICBzZXEgewogICAgICBpZiBiaW5vbWlhbHMuSXNFbXB0eSB0aGVuIDAKICAgICAgZWxzZSBpZiBjaG9zZW4gPSAzIHRoZW4geWllbGQgcHJvZHVjdAogICAgICBlbHNlIAogICAgICAgIHlpZWxkISByZWNTb2x1dGlvbiBiaW5vbWlhbHMuVGFpbCBwcm9kdWN0IGNob3NlbgogICAgICAgIHlpZWxkIHJlY1NvbHV0aW9uIGJpbm9taWFscy5UYWlsIChwcm9kdWN0ICogYmlub21pYWxzLkhlYWQpIChjaG9zZW4gKyAxKQogICAgfQogIFNlcS5zdW0ocmVjU29sdXRpb24gYmlub21pYWxzIDEgMCkKICAKQ29uc29sZS5Xcml0ZUxpbmUgc29sdXRpb24K
compilation info
/home/Ad1RhR/prog.fs(28,33): warning FS0020: This expression should have type 'unit', but has type 'int'. Use 'ignore' to discard the result of the expression, or 'let' to bind the result to a name.
/home/Ad1RhR/prog.fs(32,15): error FS0001: Type mismatch. Expecting a
'a
but given a
seq<'a>
The resulting type would be infinite when unifying ''a' and 'seq<'a>'
stdout