Problem Statement
DivNim is a version of the NIM game.
This version is played with a whiteboard. At any moment during the game there is a collection of (not necessarily distinct) positive integers written on the board. Two players take alternating turns. In each turn, the current player chooses one number (let's call it X), erases it and in its place writes a proper divisor of X. The game ends when there are no more moves left.
For example, if the board has the numbers { 1, 12, 27, 12 }, the current player can either erase one of the 12s and then write 1, 2, 3, 4, or 6 instead of it, or they can erase the 27 and replace it with 1, 3, or 9.
DivNim can be played in two ways: in normal play the player who's unable to make a move loses, and in misere play that player wins the game.
You are going to play a game of DivNim against Shawn, the local DivNim champion who always plays optimally.
You already made the agreement that all starting numbers will be between lo and hi, inclusive.
Some such numbers are already on the whiteboard; these are given in the
Before the game starts you have to add exactly one additional number N to the whiteboard. (The number you add must be within the allowed range. It can be a duplicate of a number already on the board.) Then, Shawn will be the one to take the first turn of the game.
For each mode of play, count the number of ways in which you can choose N so that you can win the game (if you play optimally). Return a
Definition
- Class:
- DivNim
- Method:
- solve
- Parameters:
- long, long, long[]
- Returns:
- int[]
- Method signature:
- int[] solve(long lo, long hi, long[] board)
- (be sure your method is public)
Constraints
- lo will be between 1 and 10^12, inclusive.
- hi will be between lo and 10^12, inclusive.
- hi - lo will not exceed 10^5.
- board will contain between 0 and 50 elements, inclusive.
- Each element of board will be between lo and hi, inclusive.
Examples
1
12
{}
Returns: {1, 5 }
The board is empty, so you will be playing only with the number N you'll add to the board. If you are playing with the normal rule, you can only win if you choose N = 1 (in which case Shawn immediately has no valid move and loses). In all other scenarios Shawn erases your N, writes down 1 instead, and then you lose. If you are playing with the misere rule, you should choose one of the available primes (2, 3, 5, 7, or 11) as your N. If you choose N = 1, Shawn wins immediately, and in all other scenarios Shawn can make sure that he wins after your first move.
12
12
{12, 12, 12, 12, 12}
Returns: {1, 1 }
You must add a sixth 12 to the board. This creates a symmetric position, and in both modes of play you can use that symmetry to your advantage and defeat Shawn.
10
30
{12, 16, 29, 24, 28}
Returns: {6, 6 }
1
12
{1, 1, 1}
Returns: {1, 5 }
As you cannot do anything with a 1 written on the whiteboard, this example is essentially the same as Example #0.
1
30
{4, 8}
Returns: {10, 10 }
xor = 1 but items aren't small only
1
30
{4, 7, 8}
Returns: {1, 1 }
xor = 0 but items aren't small only
999999900000
1000000000000
{}
Returns: {0, 3613 }
999999900000
1000000000000
{999999927430, 999999972431, 999999973387, 999999905368, 999999957622, 999999922756, 999999979950, 999999920309, 999999965744, 999999927696, 999999992391, 999999907288, 999999906323, 999999929274, 999999945339, 999999976826, 999999935878, 999999922679, 999999949401, 999999936664, 999999968465, 999999954643, 999999968946, 999999911479, 999999914597, 999999944528, 999999993931, 999999980476, 999999993596, 999999960504, 999999931505, 999999914630, 999999989601, 999999943816, 999999980729, 999999974672, 999999916367, 999999901611, 999999923882, 999999916821, 999999991601, 999999940070, 999999974044, 999999986361, 999999974769, 999999994508, 999999901946, 999999910804, 999999924720, 999999900665}
Returns: {0, 0 }
999999900000
1000000000000
{999999972431, 999999973387, 999999905368, 999999957622, 999999922756, 999999979950, 999999920309, 999999965744, 999999927696, 999999992391, 999999907288, 999999906323, 999999929274, 999999945339, 999999976826, 999999935878, 999999922679, 999999949401, 999999936664, 999999968465, 999999954643, 999999968946, 999999911479, 999999914597, 999999944528, 999999993931, 999999980476, 999999993596, 999999960504, 999999931505, 999999914630, 999999989601, 999999943816, 999999980729, 999999974672, 999999916367, 999999901611, 999999923882, 999999916821, 999999991601, 999999940070, 999999974044, 999999986361, 999999974769, 999999994508, 999999901946, 999999910804, 999999924720, 999999900665}
Returns: {16820, 16820 }
1
64327
{46972, 45063, 23164}
Returns: {11882, 11882 }
1
46
{33, 40, 35, 31, 28, 24, 3, 39, 17, 42, 39, 34}
Returns: {10, 10 }
1
1
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
Returns: {1, 0 }
1
1
{1, 1, 1}
Returns: {1, 0 }
1
51
{40, 48, 28, 24, 4, 23, 38, 4, 26, 41, 18, 17, 14, 19, 14, 30, 43, 20, 29, 50, 29, 21, 44, 4, 10, 38, 31, 1, 2, 28, 30, 34, 29, 40, 17, 19, 7}
Returns: {18, 18 }
1
945
{628, 186}
Returns: {1, 1 }
1
15756
{}
Returns: {1, 1837 }
1
29
{23, 16, 11, 21, 21, 4, 9, 16, 26, 3}
Returns: {6, 6 }
1
620
{528, 173, 170, 80, 95, 129, 604, 404, 357, 125, 425, 302, 563, 225, 356, 93, 322, 105, 37, 207}
Returns: {21, 21 }
1
3385
{415, 1799, 3168, 2388, 509, 395, 1371}
Returns: {0, 0 }
74929704
75029365
{74935499, 75013843, 75010625, 75017433, 74930530, 74963282}
Returns: {0, 0 }
2803405
2903401
{2838375, 2811840, 2824672, 2830238, 2833214, 2858730, 2865355, 2829285, 2842295, 2804183, 2818371, 2882639, 2877384, 2804959, 2836317}
Returns: {4077, 4077 }
14485407639
14485507638
{14485457898, 14485468461}
Returns: {5758, 5758 }
17367
117365
{78107, 70682, 112855, 111782, 60963, 111671, 29154}
Returns: {25473, 25473 }
4918268
5018267
{}
Returns: {0, 6519 }
124405340
124504892
{124482653, 124436990, 124501152, 124482380, 124422152, 124414581, 124407637, 124423293}
Returns: {39, 39 }
437850905978
437851005317
{437850924543, 437850967236, 437850957408}
Returns: {3347, 3347 }
116109818966
116109918966
{116109868823, 116109917809, 116109841502}
Returns: {21425, 21425 }
1439326353
1439426313
{1439406723, 1439411633, 1439354803}
Returns: {4779, 4779 }
1239946637
1240046579
{1240030827, 1240029777, 1240033735, 1239975932, 1240018469, 1239958338, 1240019454, 1240001593, 1239987145, 1239987972, 1239995645, 1239962201, 1239958574, 1240037355, 1239987828, 1240006223, 1239974405, 1239962033, 1240032264, 1239957993, 1240016867, 1240033710}
Returns: {15497, 15497 }
1964137
2064125
{2015370, 2024982, 2055166, 2023126, 2002707, 2045610, 1976450, 2047947}
Returns: {24637, 24637 }
1540557
1640545
{1631044, 1615876}
Returns: {3870, 3870 }
563242937
563342917
{563274989, 563333241}
Returns: {15297, 15297 }
650874
750844
{675580}
Returns: {12800, 12800 }
90400299
90500299
{90491278, 90434561, 90420091, 90451553, 90488701, 90429049, 90429371, 90499004, 90423644, 90411601, 90438318, 90468041, 90419402, 90461264, 90438991, 90404437, 90414269, 90489387, 90473032, 90429249, 90427473, 90414232, 90426112, 90465755, 90450533, 90439939, 90494225, 90433767, 90401894, 90444262, 90447534, 90455345, 90412972, 90411825, 90443498, 90434385, 90470201, 90430673, 90476455, 90494589, 90490750, 90418352, 90432535, 90488567, 90465477, 90472501, 90491795, 90483154, 90426597, 90404770}
Returns: {8701, 8701 }
48592050635
48592150400
{48592057555, 48592124434, 48592084940, 48592140853, 48592084523}
Returns: {21375, 21375 }
401036491571
401036591531
{401036498668}
Returns: {16722, 16722 }
16574786
16674781
{16665678, 16666911, 16665054, 16605494, 16641970, 16650288, 16617339}
Returns: {52, 52 }
3092320046
3092419875
{3092367074, 3092383393, 3092321232, 3092356543, 3092394946, 3092380354, 3092378505, 3092344377, 3092336203, 3092353957, 3092368367, 3092381105, 3092327111, 3092384533, 3092410782, 3092324341, 3092375864, 3092404132, 3092330782, 3092410348, 3092419693, 3092411682, 3092347576, 3092368634, 3092345758, 3092350253, 3092414947, 3092396769, 3092338816, 3092347038, 3092384987, 3092387422, 3092417655, 3092334026, 3092358135, 3092399465, 3092403638, 3092416917, 3092409881}
Returns: {2830, 2830 }
16496515788
16496615400
{16496566475}
Returns: {21687, 21687 }
34352066712
34352166626
{34352087521, 34352121649, 34352139294, 34352070538, 34352076230, 34352098705, 34352155411}
Returns: {13968, 13968 }
2419284700
2419384697
{2419292453, 2419353310}
Returns: {9627, 9627 }
323504
423498
{404943, 368318, 350860, 357543, 368332, 414365, 339325, 405096, 343426, 401568, 382569, 373129, 399705, 367539, 350009, 357291, 359464, 411634}
Returns: {392, 392 }
402535249
402635150
{402620024, 402590230, 402600087}
Returns: {0, 0 }
2312401587
2312501353
{}
Returns: {0, 4598 }
2184110093
2184210075
{2184158124, 2184198527, 2184160275, 2184135331, 2184175322, 2184201873, 2184119331, 2184192404, 2184183171, 2184175173, 2184136112}
Returns: {2824, 2824 }
628598
728370
{654754, 679282, 662372, 705810, 689017, 724312, 680535, 683775, 691995, 633121, 650327, 648937, 653997, 675175, 706691, 723313, 698363, 674582, 647933, 719481, 634779, 713252, 633366, 645297, 711662, 652709, 652135, 635206, 630156, 720302, 675429, 656237, 631646, 694951, 646066, 632591, 724405, 673619, 726445, 661750, 668174, 682913, 725997, 647366, 687281, 723461, 686750}
Returns: {20368, 20368 }
6126255345
6126355171
{6126331629}
Returns: {21517, 21517 }
377762337
377862282
{377814114}
Returns: {9135, 9135 }
37078489446
37078589398
{37078506380, 37078569400, 37078556066, 37078570726}
Returns: {39, 39 }
55356963
55456962
{55449812}
Returns: {21005, 21005 }
28099481648
28099581636
{28099529408, 28099553197, 28099580624}
Returns: {191, 191 }
416615313316
416615412604
{416615394716, 416615387338, 416615350860, 416615339727, 416615357830, 416615326546, 416615384019, 416615341556, 416615376600, 416615337394, 416615322442, 416615377841, 416615319888, 416615339857, 416615321528, 416615360687, 416615317936, 416615371088, 416615322100, 416615407903, 416615404380, 416615386782}
Returns: {898, 898 }
32429808
32529807
{32433054, 32526061}
Returns: {0, 0 }
2070258243
2070357322
{2070309210}
Returns: {21145, 21145 }
122200054
122300044
{122270378, 122231998, 122201935, 122271159, 122218851, 122239591, 122266358, 122262851, 122200422, 122210852, 122265692, 122278527, 122271415, 122281229, 122275235, 122234855, 122262243, 122224434, 122228280, 122228685, 122243711, 122291269, 122211146, 122288041, 122278127, 122276457, 122265342, 122214566, 122202715, 122261186, 122289685, 122258359, 122203719, 122205566, 122265522, 122260275, 122227189, 122298353, 122215415}
Returns: {33, 33 }
113392220718
113392320336
{113392252474, 113392224946, 113392258899}
Returns: {3874, 3874 }
999991
1099294
{1050660, 1070626, 1057764, 1042566}
Returns: {20072, 20072 }
63567
163561
{101083, 160272}
Returns: {164, 164 }
654787625
654887621
{654867378, 654837222, 654824595}
Returns: {4909, 4909 }
54465407
54565397
{54492008, 54465940, 54522580, 54467828}
Returns: {5617, 5617 }
211878188
211978184
{211936380, 211949151, 211913531, 211894354, 211970143, 211921123, 211879691, 211942578, 211952931, 211946238, 211947811, 211967613, 211919637, 211950126}
Returns: {5194, 5194 }
328038172
328138137
{328071302, 328119209, 328055264, 328055470, 328069666, 328053146, 328086103, 328080667, 328090091, 328092132, 328117030}
Returns: {15993, 15993 }
30187375
30287257
{30237267, 30200765, 30280429, 30286813, 30253698, 30283198, 30213096, 30201084, 30285349, 30227737, 30259152, 30223137, 30257830, 30208920, 30268336, 30232614, 30271650, 30226394, 30222507, 30277638, 30236770, 30188066, 30223763, 30189125, 30266499, 30226670}
Returns: {55, 55 }
43276543
43376327
{43300452, 43373852, 43367805, 43373860, 43321257, 43314870, 43327930, 43359862, 43286118, 43372800, 43364592, 43357869, 43292272, 43354992, 43372297, 43280568, 43354971, 43338892, 43345333, 43339202, 43324814, 43348040, 43296708, 43298846, 43327818, 43350894, 43372593, 43372623, 43355278, 43319599, 43300811, 43329281, 43346477, 43303365, 43308855, 43276906, 43335780, 43303401, 43349973}
Returns: {290, 290 }
2581046148
2581146141
{2581086775, 2581061087, 2581104523, 2581108874}
Returns: {5426, 5426 }
114356582230
114356681365
{114356602812, 114356583959, 114356592708, 114356617022}
Returns: {0, 0 }
49239014785
49239114779
{49239045357}
Returns: {16220, 16220 }
3456339651
3456439231
{3456342944, 3456365874, 3456412116, 3456419497, 3456363311, 3456406284, 3456403656, 3456386653, 3456413341, 3456385942, 3456382120, 3456396452, 3456339889, 3456373254, 3456347695, 3456384133, 3456419384, 3456343988, 3456344969, 3456353165, 3456393546, 3456379376, 3456405179, 3456393187, 3456391462, 3456390410, 3456373023, 3456428174, 3456412046, 3456435681, 3456376645, 3456421081, 3456359914, 3456378221, 3456369538, 3456371173}
Returns: {0, 0 }
258130636
258230633
{258227421, 258208445, 258181123, 258204093, 258192442, 258192872, 258196534, 258201913, 258164069, 258179808, 258189528, 258176955, 258217221, 258202665, 258203014, 258140250, 258212707, 258178801, 258182899}
Returns: {4962, 4962 }
1
64327
{51683, 7219, 25919}
Returns: {6441, 1 }
1
47247
{28549, 44179, 11579, 33533, 13183, 37181, 24821, 15671, 40151, 36473, 7673, 46187}
Returns: {1, 4871 }
1
51
{23, 41, 17, 19, 43, 29, 29, 31, 2, 29, 17, 19, 7, 11, 37, 17, 2, 3, 5, 5, 41, 47, 7, 7, 43, 31, 29, 13, 5, 7, 17, 23, 2, 17, 19, 47, 31}
Returns: {15, 1 }
1
620
{173, 563, 37, 139, 587, 503, 439, 61, 419, 487, 7, 263, 353, 197, 569, 379, 137, 307, 433, 263}
Returns: {1, 114 }
1
12625
{6011}
Returns: {1508, 1 }
1
15
{13}
Returns: {6, 1 }
1
2415
{1667, 1723}
Returns: {1, 358 }
1
1629
{457}
Returns: {258, 1 }
1
16
{5, 3, 5, 5, 5, 5, 11, 13}
Returns: {1, 6 }
1
38
{}
Returns: {1, 12 }
65729348
65828908
{65800061, 65763277, 65807633}
Returns: {5531, 0 }
10150814
10250702
{10215347, 10215721, 10178891}
Returns: {6119, 0 }
34326863752
34326963726
{34326947947, 34326943457, 34326943583, 34326922741, 34326887657, 34326866983, 34326946373, 34326901027, 34326923291, 34326923017, 34326884531, 34326922459}
Returns: {0, 4058 }
650874
750844
{742507}
Returns: {7412, 0 }
1478863376
1478962927
{1478924341, 1478881429, 1478924141, 1478897003, 1478870473, 1478946251, 1478911573, 1478887199, 1478863621, 1478919503, 1478935663, 1478933321, 1478867671, 1478928317, 1478959877, 1478876587, 1478914211, 1478887369, 1478906711, 1478887651, 1478870741, 1478867899, 1478909953, 1478927873, 1478866661, 1478949487, 1478875423, 1478905403, 1478930339, 1478867959, 1478880071, 1478921053, 1478897417, 1478934097, 1478898847, 1478956307, 1478875001, 1478903897, 1478960761, 1478868683, 1478892367, 1478873689, 1478922761, 1478892007, 1478939779, 1478892487, 1478959609, 1478867801, 1478937641, 1478915089}
Returns: {0, 4748 }
3072403
3171487
{3166333, 3120919, 3093743, 3162847}
Returns: {0, 6656 }
199844
299723
{207079, 250361}
Returns: {0, 8004 }
2510439261
2510538757
{2510461609, 2510531239, 2510500021}
Returns: {4592, 0 }
1205020047
1205120046
{}
Returns: {0, 4818 }
69488541
69588483
{69560479, 69512843, 69556789, 69505633}
Returns: {0, 5588 }
839760
939642
{865481, 884999, 840451, 858943, 851863, 898717, 928799, 918209, 869849, 912533, 932317, 907999, 937949, 923123, 924191, 881917, 913571, 894547, 896561, 891571, 842089, 913217, 901441, 853217, 912349, 842701}
Returns: {0, 7291 }
1905900
2005899
{1910071, 1922867, 1981607, 2005723, 1916543, 1916737}
Returns: {0, 6915 }
2088908
2188908
{}
Returns: {0, 6861 }
513185448903
513185548887
{513185538953, 513185495321, 513185474959, 513185515309, 513185545619, 513185504801}
Returns: {0, 3652 }
233403276
233503227
{233499061}
Returns: {5176, 0 }
5456295248
5456395243
{5456366683}
Returns: {4431, 0 }
2879173935
2879273812
{2879236303, 2879251589, 2879227531, 2879221831, 2879253803}
Returns: {4584, 0 }
3578920
3678908
{3587891, 3592657, 3637577, 3659479}
Returns: {0, 6668 }
110615898
110715885
{110677823, 110620919, 110648987, 110630321, 110709601}
Returns: {5396, 0 }
112755252
112855024
{112818187, 112764251, 112782221, 112829609, 112817371, 112777963, 112774279, 112781237, 112803179, 112852591}
Returns: {0, 5393 }
1
64327
{1, 1, 51683}
Returns: {6441, 1 }
1
46
{1, 1, 1, 17, 1, 1, 37, 23, 1, 31, 7, 37}
Returns: {1, 14 }
1
49
{17, 13, 1, 1, 5, 41, 2, 47, 37, 37, 1, 1, 23}
Returns: {15, 1 }
1
51
{1, 1, 23, 41, 1, 1, 19, 43, 1, 1, 1, 1, 31, 2, 1, 1, 1, 1, 1, 11, 1, 1, 1, 1, 37, 1, 1, 3, 5, 1, 1, 5, 1, 41, 1, 7, 7}
Returns: {1, 15 }
1
10
{3, 2, 7, 1, 7, 1, 2, 1, 3, 1, 7, 1, 1, 1, 1, 1, 1, 7, 2, 7}
Returns: {1, 4 }
1
11445
{7331, 4909, 1, 9257, 1, 6011}
Returns: {1, 1380 }
1
15
{7}
Returns: {6, 1 }
1
24
{1, 1}
Returns: {1, 9 }
1
56
{47}
Returns: {16, 1 }
1
167
{151, 19, 157, 1, 1, 1, 43, 31}
Returns: {39, 1 }
999999899999
999999999999
{999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019, 999999900019 }
Returns: {0, 3613 }
999999900005
1000000000000
{999999999999, 999999999987 }
Returns: {110, 110 }
1
2
{2 }
Returns: {1, 1 }
999999900000
1000000000000
{999999995904, 1000000000000, 999999963136, 999999959040, 999999930368, 999999974400, 999999991052, 999999952896, 999999977245, 1000000000000, 999999902433, 999999934229, 999999921093, 999999976814, 999999980264, 999999914375, 999999920373, 999999901085, 999999909649, 999999952856, 999999920433, 999999944878, 999999912885, 999999917178, 999999989068, 999999978825, 999999950466, 999999988630, 999999925256, 999999943766, 999999901322, 999999979967, 999999955831, 999999997049, 999999906571, 999999934168, 999999911298, 999999984304, 999999991197, 999999908513, 999999935109, 999999968388, 999999917009, 999999972261, 999999990986, 999999978868, 999999990030, 999999948530, 999999920641, 999999937299 }
Returns: {931, 931 }