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 yield 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+IG4gJSBpID0gMCkgWzIuLihuIC0gMSldCiAgICAKbGV0IHByaW1lcyA9IExpc3QuZmlsdGVyIGlzUHJpbWUgWzEwMDAuLjUwMDBdCmxldCBiaW5vbWlhbHMgPSBMaXN0Lm1hcCAoZnVuIG0gLT4gYmlub21pYWxNb2QgKGludCAoMTAwMDAwMDAwMDAwMEwgJSAoaW50NjQgbSkpKSAxMDAwMDAwMDAwKSBwcmltZXMKCmxldCBzb2x1dGlvbiA9CiAgbGV0IHJlYyByZWNTb2x1dGlvbiAoYmlub21pYWxzOihpbnQgbGlzdCkpIHByb2R1Y3QgY2hvc2VuID0KICAgIHNlcSB7CiAgICAgIGlmIGJpbm9taWFscy5Jc0VtcHR5IHRoZW4geWllbGQgMAogICAgICBlbHNlIGlmIGNob3NlbiA9IDMgdGhlbiB5aWVsZCBwcm9kdWN0CiAgICAgIGVsc2UgCiAgICAgICAgeWllbGQhIHJlY1NvbHV0aW9uIGJpbm9taWFscy5UYWlsIHByb2R1Y3QgY2hvc2VuCiAgICAgICAgeWllbGQgcmVjU29sdXRpb24gYmlub21pYWxzLlRhaWwgKHByb2R1Y3QgKiBiaW5vbWlhbHMuSGVhZCkgKGNob3NlbiArIDEpCiAgICB9CiAgU2VxLnN1bShyZWNTb2x1dGlvbiBiaW5vbWlhbHMgMSAwKQogIApDb25zb2xlLldyaXRlTGluZSBzb2x1dGlvbgo=
compilation info
/home/1u3ZCh/prog.fs(32,15): error FS0001: This expression was expected to have type
int
but here has type
seq<int>
/home/1u3ZCh/prog.fs(34,23): error FS0001: Type mismatch. Expecting a
int list
but given a
(int -> int) list
The type 'int' does not match the type 'int -> int'
stdout