1 USING: circular disjoint-sets kernel math math.ranges
2 sequences sequences.lib ;
5 : (generator) ( k -- n )
6 dup sq 300007 * 200003 - * 100003 + 1000000 rem ;
8 : <generator> ( -- lag )
9 55 [1,b] [ (generator) ] map <circular> ;
12 [ { 0 31 } swap nths sum 1000000 rem ] keep push-circular ;
15 [ first ] [ advance ] bi ;
17 : 2unless? ( x y ?quot quot -- )
18 >r 2keep rot [ 2drop ] r> if ; inline
20 : (p186) ( generator counter unionfind -- counter )
21 524287 over equiv-set-size 990000 <
23 pick [ next ] [ next ] bi
32 : <relation> ( n -- unionfind )
33 <disjoint-set> [ [ add-atom ] curry each ] keep ;
36 <generator> 0 1000000 <relation> (p186) ;