(* list solutions of x1+...+xn=m 1<=x1<...<xn<=l *)letlist_solutionsmnk=letrecloopmnlbdtail=ifm<n||m<lbdthen[]elseifn=1theniflbd<=m&&m<=kthen[m::tail]else[]elseletacc=ref[]infori=lbdto(min(m-n+1)k)doacc:=List.map(funsols->i::sols)(loop(m-i)(n-1)(i+1)tail)::!accdone;List.concat!accinloopmn1letrecdisjointxsys=matchxs,yswith|[],_|_,[]->true|x::xs',y::ys'->ifx>ythendisjointxsys'elseifx<ythendisjointxs'yselsefalselet(@<)=List.mergecompareletreccount_choicesnlistsex=ifn=1thenList.fold_left(funix->ifdisjointxextheni+1elsei)0listselsematchlistswith|[]->0|x::rest->letb=count_choicesnrestexinifdisjointxexthenb+count_choices(n-1)rest(x@<ex)elsebletcount_partitionsn=count_choicesn(list_solutions(n*(n*n+1)/2)n(n*n)[])[]let_=print_int(count_partitions5);exit0
kozima
#4821()
[
OCaml
]
Rating2/2=1.00
和が N*(N^2+1)/2 になる組み合わせを昇順に列挙して交わらないものを探す。nido さんの #4819 と同じ方針かな?
5 のときは 20 分かかって答えが出ました。 3245664 だそうです。
Rating2/2=1.00-0+
1 reply [ reply ]