Problem Statement
You have a deck of cards. Each card has a small nonnegative integer written on it. You are given the
You are playing a game in which the goal is to end with three cards whose total is target. The game is played as follows:
- The deck is randomly shuffled.
- You draw the top three cards.
- You decide which of the three cards in your hand you want to keep and which ones you want to discard. You may keep any subset of cards, including none or all of them.
- You discard the chosen cards onto a separate pile. (The discarded cards do not go back into the deck.)
- You draw more cards from the deck until you have three cards in your hand again.
- If the sum of your cards is target, you win. Otherwise, you lose.
You also lose the game whenever you try to draw a card from an empty deck.
Assuming you play optimally, what is the probability of winning the game?
Definition
- Class:
- CardDrawGame
- Method:
- winChance
- Parameters:
- int, int[]
- Returns:
- double
- Method signature:
- double winChance(int target, int[] count)
- (be sure your method is public)
Notes
- The returned value must be within 1e-9 absolute or relative error of the actual value to be accepted.
Constraints
- target will be between 0 and 50, inclusive.
- count will contain between 1 and 20 elements, inclusive.
- Each element of count will be between 0 and 100, inclusive.
Examples
3
{0, 3}
Returns: 1.0
The deck has three cards, each of which is a 1. You're guaranteed to get a total of 3 on the initial draw of 3 cards.
10
{3, 3}
Returns: 0.0
There's six cards in the deck, but none of them are larger than a 1, so getting a total of 10 is impossible.
3
{1, 3}
Returns: 1.0
One of the four cards is a 0 and the other three are 1s. If you draw all three 1s, you win. If you draw two 1s and the 0, the optimal play is to discard the 0 and to draw the remaining card: the third 1.
6
{1, 1, 3}
Returns: 0.7000000000000001
There's a 0.1 chance of getting 2-2-2 on the initial draw, and not needing to draw any cards. There's a 0.3 chance of getting 0-1-2 on the first three cards (in any order), after which redrawing two cards for the 0 and 1 is guaranteed to end up a winning hand. There's a 0.3 chance of getting 0-2-2, and a 0.3 chance of getting 1-2-2; in either case, redrawing one card gives a 0.5 chance of getting the winning hand. Thus, the answer is 0.1 + 0.3 * 1.0 + 0.6 * 0.5 = 0.7
12
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
Returns: 0.003681666273366085
3
{0,0,0,2}
Returns: 0.0
There are only two cards. You will lose the game almost immediately, as you are unable to draw the initial three-card hand.
0
{3, 3}
Returns: 0.39999999999999997
You always want to keep all the 0s you have and discard all the 1s. In particular, if your initial draw is three 1s, the optimal strategy is to discard the whole hand.
5
{1,2,1,1,1}
Returns: 0.6333333333333331
50
{100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100}
Returns: 0.022323614316228788
3
{0,0,0,1}
Returns: 0.0
14
{0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1}
Returns: 0.09437229437229548
15
{2, 2, 1, 1, 0, 0, 2, 1, 2, 2, 1, 2, 1, 2, 2, 0}
Returns: 0.11679197994987402
30
{0, 1, 2, 0, 2, 3, 2, 0, 1, 2, 1, 3, 0, 3, 2, 2, 1, 2, 2, 0}
Returns: 0.12354237716306858
35
{4, 3, 2, 4, 1, 4, 0, 1, 3, 3, 2, 4, 4, 1, 3, 0, 1}
Returns: 0.06106749462012641
1
{0, 0, 2, 4, 4, 4, 3, 3, 2, 0, 4, 2, 5, 4, 4, 5, 3, 5, 5, 2}
Returns: 0.0
6
{1, 1, 2, 3, 6, 5, 1, 1, 3, 1, 1, 0, 1, 5, 6, 4, 2, 4, 3}
Returns: 0.007791208065094629
11
{7, 0, 1, 6, 1, 5, 0, 4, 0, 2, 2, 7, 3, 7, 7, 0, 1}
Returns: 0.05533014947633677
35
{8, 5, 0, 3, 0, 6, 1, 0, 1, 4, 0, 8, 4, 3, 8, 2}
Returns: 0.06949851638768732
32
{4, 9, 9, 1, 9, 7, 5, 8, 0, 1, 6, 6, 5, 4, 9, 7, 9, 2, 1}
Returns: 0.10363384969083182
10
{7, 10, 7, 0, 6, 9, 8, 1, 4, 7, 8, 1, 3, 5, 5}
Returns: 0.10026957491148072
49
{0, 9, 1, 10, 7, 7, 4, 10, 8, 10, 11, 11, 0, 8, 3, 10, 4, 0}
Returns: 0.0
19
{8, 7, 6, 1, 11, 12, 1, 8, 11, 9, 9, 7, 8, 11, 12, 5, 9}
Returns: 0.09762082539047387
5
{12, 10, 3, 11, 10, 1, 1, 8, 12, 4, 6, 5, 8, 13, 5, 13, 1, 13}
Returns: 0.028002380594647425
42
{11, 6, 5, 0, 5, 9, 13, 0, 14, 6, 10, 12, 4, 4, 3, 4, 3, 7, 13}
Returns: 0.04990834038245657
27
{14, 14, 10, 1, 4, 15, 0, 0, 13, 14, 14, 8, 9, 3, 9, 3, 5}
Returns: 0.11241266518540505
26
{15, 13, 7, 16, 16, 8, 10, 0, 12, 14, 5, 12, 1, 5, 5, 2, 15}
Returns: 0.0995037542739025
32
{7, 14, 5, 12, 0, 4, 2, 17, 12, 0, 12, 15, 14, 11, 3}
Returns: 0.09929790562789585
25
{3, 2, 13, 13, 17, 3, 5, 15, 15, 14, 2, 12, 16, 16, 10, 13, 6, 10}
Returns: 0.11459931004334731
41
{4, 15, 10, 3, 8, 15, 2, 11, 0, 12, 19, 2, 19, 7, 16}
Returns: 0.011466663352341717
37
{16, 8, 9, 16, 19, 3, 17, 1, 9, 5, 15, 7, 12, 19, 15, 0}
Returns: 0.04877159991280091
4
{19, 7, 20, 17, 11, 3, 10, 2, 5, 18, 3, 7, 5, 2, 4, 16, 5, 5}
Returns: 0.057241622398269576
6
{4, 18, 12, 11, 3, 13, 9, 17, 20, 7, 21, 11, 2, 20, 10}
Returns: 0.025053194981367644
33
{6, 17, 4, 10, 2, 10, 22, 21, 13, 16, 17, 18, 21, 11, 16}
Returns: 0.09361826278967182
6
{20, 14, 13, 21, 13, 23, 15, 0, 6, 10, 1, 19, 13, 3, 14, 24, 18, 3}
Returns: 0.04837891209714356
12
{13, 23, 1, 10, 25, 24, 5, 21, 13, 15, 23, 16, 15, 22, 16, 3, 7}
Returns: 0.07249383877637472
16
{0, 17, 15, 10, 4, 21, 5, 24, 9, 2, 1, 23, 26, 19, 9, 1, 20, 19, 21, 0}
Returns: 0.053973795724048465
26
{6, 17, 6, 11, 11, 4, 6, 14, 19, 1, 25, 23, 26, 9, 19, 21, 9}
Returns: 0.1268338615400366
25
{13, 26, 13, 11, 24, 15, 8, 1, 23, 18, 23, 22, 15, 7, 8}
Returns: 0.12166295571575503
21
{27, 0, 12, 6, 24, 13, 11, 16, 2, 11, 23, 27, 19, 28, 20}
Returns: 0.12153347130663096
7
{27, 26, 2, 28, 2, 15, 8, 2, 5, 6, 7, 29, 13, 15, 25, 6, 9, 0}
Returns: 0.0566658942514588
2
{0, 16, 13, 23, 30, 13, 21, 25, 2, 26, 20, 22, 0, 6, 1, 19, 3, 13, 0}
Returns: 0.0
16
{3, 24, 29, 12, 5, 17, 25, 32, 22, 2, 4, 19, 19, 3, 28, 29, 26, 21, 5}
Returns: 0.07210693919575178
9
{23, 6, 24, 24, 11, 18, 1, 1, 12, 8, 14, 5, 0, 27, 27, 26, 27, 8}
Returns: 0.04027915845981246
50
{24, 34, 29, 16, 9, 4, 2, 15, 8, 4, 1, 8, 7, 33, 8, 18, 26, 31, 1, 10}
Returns: 0.027990005742028024
23
{34, 9, 14, 7, 9, 18, 30, 31, 29, 19, 26, 28, 11, 0, 27, 31, 31, 26, 21}
Returns: 0.09688467833145016
22
{19, 19, 25, 24, 2, 33, 17, 9, 29, 25, 6, 6, 2, 23, 21, 36, 9, 0, 16}
Returns: 0.11005274018995426
44
{2, 26, 30, 20, 9, 17, 16, 21, 26, 7, 13, 11, 14, 18, 15, 29}
Returns: 0.011575481021994799
48
{21, 9, 33, 23, 7, 9, 11, 36, 14, 34, 36, 33, 20, 34, 13, 15, 2, 23, 24}
Returns: 0.016645465308232604
42
{31, 38, 10, 12, 25, 3, 30, 20, 35, 34, 4, 16, 6, 8, 32, 37}
Returns: 0.016327261021177267
36
{17, 38, 24, 7, 16, 35, 22, 7, 24, 23, 34, 14, 18, 16, 38, 20}
Returns: 0.05576784416526737
2
{39, 13, 18, 28, 20, 7, 9, 37, 11, 16, 21, 17, 6, 18, 13}
Returns: 0.02781416882770267
26
{39, 41, 13, 12, 31, 31, 4, 24, 41, 1, 41, 37, 9, 6, 26, 19, 14}
Returns: 0.1209309657979036
29
{5, 13, 41, 40, 42, 14, 35, 5, 35, 26, 19, 20, 23, 7, 5, 20}
Returns: 0.08440321640725144
49
{7, 41, 5, 34, 42, 21, 36, 44, 30, 14, 3, 20, 19, 42, 24, 16}
Returns: 0.0
36
{3, 4, 16, 29, 32, 14, 32, 32, 31, 18, 20, 27, 33, 15, 39, 43, 44, 41, 21}
Returns: 0.11013615346240806
21
{13, 36, 11, 12, 15, 2, 1, 44, 38, 32, 38, 16, 38, 18, 12, 21, 37, 38, 40, 35}
Returns: 0.06641637582641251
44
{11, 47, 20, 23, 11, 10, 42, 46, 31, 4, 2, 25, 29, 44, 28, 18, 39, 6, 40}
Returns: 0.049256310677844584
23
{40, 17, 21, 18, 44, 13, 44, 27, 4, 16, 39, 24, 20, 29, 18, 10, 15, 11}
Returns: 0.12020149965823343
15
{19, 2, 13, 44, 36, 30, 1, 22, 0, 40, 18, 17, 35, 26, 48, 33}
Returns: 0.07341070180531228
1
{29, 3, 5, 46, 8, 46, 25, 28, 11, 15, 2, 25, 43, 28, 34, 33, 6, 35}
Returns: 7.078700465649993E-4
17
{28, 34, 31, 37, 10, 10, 50, 48, 15, 17, 42, 20, 12, 35, 43, 31, 32, 51, 47}
Returns: 0.06596556967723079
45
{16, 21, 33, 7, 14, 48, 16, 50, 14, 2, 50, 8, 15, 44, 47, 45, 28, 47}
Returns: 0.054447314743458604
23
{20, 46, 35, 47, 41, 41, 13, 20, 40, 6, 50, 16, 33, 10, 17}
Returns: 0.12336870725404238
6
{47, 10, 5, 11, 52, 3, 54, 49, 32, 11, 38, 41, 51, 35, 39, 39}
Returns: 0.01882722396622517
49
{2, 51, 20, 11, 5, 28, 17, 6, 19, 12, 37, 48, 48, 31, 39, 46, 9}
Returns: 0.0
1
{15, 45, 34, 54, 15, 38, 19, 16, 43, 47, 29, 51, 1, 19, 12, 47}
Returns: 0.0017117102714796653
3
{11, 17, 56, 44, 31, 12, 28, 0, 23, 40, 15, 25, 32, 11, 50, 11, 11, 38}
Returns: 0.005176037828523804
19
{20, 39, 25, 41, 19, 46, 17, 40, 5, 19, 14, 2, 35, 30, 57, 52}
Returns: 0.1146638725754302
2
{18, 53, 29, 11, 11, 35, 19, 50, 29, 18, 18, 39, 47, 3, 53, 19}
Returns: 0.011723613224677878
11
{55, 4, 39, 38, 25, 36, 32, 27, 9, 24, 24, 42, 34, 14, 33, 35, 26, 44, 28, 34}
Returns: 0.045233370459060174
1
{25, 20, 58, 21, 57, 7, 24, 27, 8, 5, 47, 27, 15, 15, 0, 16, 34}
Returns: 0.0037508368964494707
5
{25, 55, 34, 19, 62, 45, 12, 16, 62, 4, 43, 3, 15, 11, 39, 22, 22}
Returns: 0.04169450875102753
17
{63, 33, 35, 47, 26, 6, 33, 62, 29, 13, 39, 23, 50, 35, 25, 35, 20, 20, 40, 19}
Returns: 0.08323603297238352
12
{12, 36, 33, 19, 50, 28, 28, 22, 11, 37, 18, 59, 37, 4, 13, 28, 26, 13}
Returns: 0.06673383632838645
1
{49, 38, 32, 1, 42, 46, 53, 12, 11, 42, 33, 29, 17, 31, 63, 25, 4, 21}
Returns: 0.01050296103254241
39
{40, 29, 46, 29, 31, 62, 47, 25, 54, 23, 59, 28, 4, 52, 59, 29, 54, 2, 54}
Returns: 0.06794268046890174
13
{8, 62, 24, 50, 24, 0, 30, 63, 66, 1, 37, 61, 40, 39, 66, 64, 48, 28, 6}
Returns: 0.04091242253751325
9
{62, 56, 63, 51, 51, 17, 53, 45, 1, 67, 43, 13, 46, 65, 49, 33}
Returns: 0.07023487522060957
46
{27, 6, 33, 33, 22, 47, 47, 29, 17, 30, 13, 17, 46, 6, 18}
Returns: 0.0
17
{49, 34, 66, 8, 68, 19, 30, 41, 58, 66, 33, 12, 44, 32, 1, 70}
Returns: 0.12238711559813212
47
{34, 59, 67, 59, 19, 46, 17, 26, 2, 12, 6, 49, 63, 26, 67, 20, 47, 7, 71}
Returns: 0.0320322034466686
10
{70, 30, 61, 61, 54, 7, 63, 29, 65, 41, 65, 28, 49, 58, 17, 21}
Returns: 0.08110838168671618
25
{42, 0, 66, 25, 70, 57, 20, 37, 66, 55, 60, 70, 55, 2, 21, 54}
Returns: 0.13025999837128233
17
{71, 6, 7, 13, 26, 61, 24, 70, 4, 68, 15, 2, 42, 33, 61}
Returns: 0.1156587218649779
44
{14, 45, 61, 1, 35, 73, 58, 57, 23, 15, 33, 47, 59, 6, 62}
Returns: 0.0
50
{54, 10, 26, 47, 25, 29, 74, 18, 26, 63, 65, 13, 37, 69, 12}
Returns: 0.0
43
{24, 4, 19, 64, 33, 18, 35, 47, 18, 42, 68, 47, 16, 18, 54, 52, 73, 40}
Returns: 0.058633542010488676
4
{77, 48, 2, 13, 54, 21, 8, 12, 16, 13, 9, 27, 3, 23, 49, 12}
Returns: 0.0955836467757473
27
{61, 2, 15, 22, 42, 16, 16, 35, 28, 17, 6, 49, 20, 53, 70, 3, 9, 31, 64}
Returns: 0.10328474858290537
23
{80, 76, 8, 45, 31, 45, 34, 24, 5, 39, 5, 22, 7, 67, 39, 39, 55, 43, 6}
Returns: 0.10122130471786495
26
{76, 32, 81, 23, 66, 80, 20, 24, 79, 3, 68, 59, 29, 33, 53, 61, 0, 6, 43, 79}
Returns: 0.10215599476591644
16
{9, 79, 43, 26, 33, 43, 15, 79, 19, 76, 57, 48, 74, 43, 25}
Returns: 0.10675619693896607
28
{58, 31, 61, 22, 73, 52, 49, 25, 4, 41, 5, 30, 8, 14, 35, 30, 61}
Returns: 0.07968251672623021
30
{79, 12, 1, 75, 42, 36, 72, 5, 33, 47, 47, 46, 20, 11, 32, 11}
Returns: 0.07184330979113523
41
{64, 59, 85, 43, 77, 49, 20, 37, 15, 57, 54, 74, 33, 31, 30, 5, 20, 4, 39}
Returns: 0.02289682520730049
11
{63, 31, 27, 7, 34, 74, 74, 27, 65, 4, 41, 35, 17, 53, 15, 14, 29, 67}
Returns: 0.06790510025328748
42
{78, 23, 77, 14, 50, 41, 34, 0, 64, 68, 34, 22, 65, 1, 80, 65, 75, 39, 73, 38}
Returns: 0.07284281360902356
29
{73, 74, 47, 42, 31, 36, 27, 87, 88, 43, 51, 47, 87, 27, 17, 45, 65, 3}
Returns: 0.10085709941010385
23
{69, 45, 50, 11, 11, 9, 71, 53, 64, 19, 85, 23, 21, 57, 8, 27}
Returns: 0.13767893530880318
23
{49, 24, 63, 89, 9, 80, 71, 63, 25, 7, 2, 41, 71, 24, 48, 1, 17, 71, 85, 50}
Returns: 0.10111948004772912
49
{13, 31, 25, 49, 32, 75, 59, 50, 53, 61, 4, 21, 19, 24, 45, 76}
Returns: 0.0
46
{68, 44, 18, 88, 6, 82, 4, 16, 81, 23, 22, 6, 1, 89, 45, 26, 2, 64, 17, 3}
Returns: 0.015369098141528275
26
{32, 38, 53, 18, 57, 92, 56, 20, 84, 20, 67, 54, 1, 16, 23, 62, 16}
Returns: 0.12316458751784776
37
{3, 1, 74, 58, 26, 38, 21, 35, 66, 92, 39, 84, 78, 53, 23, 41, 12}
Returns: 0.06740596615973286
23
{70, 84, 28, 92, 26, 78, 58, 56, 23, 28, 83, 35, 3, 80, 12, 50, 6}
Returns: 0.12214899867814244
3
{81, 7, 56, 4, 13, 32, 43, 84, 27, 47, 1, 44, 28, 27, 25, 23, 43, 30, 49}
Returns: 0.005497500306578259
29
{14, 16, 78, 65, 79, 53, 41, 46, 57, 62, 59, 63, 75, 21, 97, 4, 53, 75, 64, 69}
Returns: 0.09749147390260593
15
{47, 55, 21, 66, 83, 70, 68, 29, 63, 52, 95, 5, 44, 38, 79, 31, 60}
Returns: 0.09055832640858527
1
{11, 63, 84, 48, 74, 27, 63, 3, 41, 31, 24, 42, 93, 75, 66, 28}
Returns: 3.209488418479873E-4
6
{90, 5, 65, 74, 42, 71, 69, 41, 44, 81, 65, 58, 79, 4, 73, 76, 23, 96}
Returns: 0.023421055814851443
35
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0}
Returns: 0.0
39
{0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 1, 0}
Returns: 0.0
16
{2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}
Returns: 0.0
33
{1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0}
Returns: 0.0
35
{0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}
Returns: 0.0
50
{0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0}
Returns: 0.0
21
{0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
Returns: 0.0
34
{0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0}
Returns: 0.0
44
{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}
Returns: 0.0
49
{0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0}
Returns: 0.0
22
{0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1}
Returns: 0.0
16
{0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1}
Returns: 0.0
31
{0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1}
Returns: 0.0
4
{1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}
Returns: 0.0
41
{0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0}
Returns: 0.0
13
{1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1}
Returns: 0.0
8
{0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0}
Returns: 0.0
36
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0}
Returns: 0.0
41
{1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0}
Returns: 0.0
2
{1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}
Returns: 0.0
50
{0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1}
Returns: 0.0
34
{1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0}
Returns: 0.0
45
{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}
Returns: 0.0
3
{1, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
Returns: 0.0
35
{0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0}
Returns: 0.0
31
{0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}
Returns: 0.0
19
{0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0}
Returns: 0.0
29
{0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}
Returns: 0.0
48
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0}
Returns: 0.0
32
{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0}
Returns: 0.0
3
{3, 3 }
Returns: 0.39999999999999997
50
{96, 93, 92, 94, 96, 94, 93, 97, 90, 98, 97, 92, 99, 90, 96, 93, 99, 93, 97, 93 }
Returns: 0.022519923607622283
30
{100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 }
Returns: 0.08472762786772521