/** * Multiply two numbers (each between 0 and 98) where the result is <= 100 */ export type Mul< A extends number, B extends number > = A extends keyof MulTable ? B extends keyof MulTable[ A ] ? MulTable[ A ][ B ] : never : never; type MulTable = { 0: { 0: 0; 1: 0; 2: 0; 3: 0; 4: 0; 5: 0; 6: 0; 7: 0; 8: 0; 9: 0; 10: 0; 11: 0; 12: 0; 13: 0; 14: 0; 15: 0; 16: 0; 17: 0; 18: 0; 19: 0; 20: 0; 21: 0; 22: 0; 23: 0; 24: 0; 25: 0; 26: 0; 27: 0; 28: 0; 29: 0; 30: 0; 31: 0; 32: 0; 33: 0; 34: 0; 35: 0; 36: 0; 37: 0; 38: 0; 39: 0; 40: 0; 41: 0; 42: 0; 43: 0; 44: 0; 45: 0; 46: 0; 47: 0; 48: 0; 49: 0; 50: 0; 51: 0; 52: 0; 53: 0; 54: 0; 55: 0; 56: 0; 57: 0; 58: 0; 59: 0; 60: 0; 61: 0; 62: 0; 63: 0; 64: 0; 65: 0; 66: 0; 67: 0; 68: 0; 69: 0; 70: 0; 71: 0; 72: 0; 73: 0; 74: 0; 75: 0; 76: 0; 77: 0; 78: 0; 79: 0; 80: 0; 81: 0; 82: 0; 83: 0; 84: 0; 85: 0; 86: 0; 87: 0; 88: 0; 89: 0; 90: 0; 91: 0; 92: 0; 93: 0; 94: 0; 95: 0; 96: 0; 97: 0; 98: 0; 99: 0; }; 1: { 0: 0; 1: 1; 2: 2; 3: 3; 4: 4; 5: 5; 6: 6; 7: 7; 8: 8; 9: 9; 10: 10; 11: 11; 12: 12; 13: 13; 14: 14; 15: 15; 16: 16; 17: 17; 18: 18; 19: 19; 20: 20; 21: 21; 22: 22; 23: 23; 24: 24; 25: 25; 26: 26; 27: 27; 28: 28; 29: 29; 30: 30; 31: 31; 32: 32; 33: 33; 34: 34; 35: 35; 36: 36; 37: 37; 38: 38; 39: 39; 40: 40; 41: 41; 42: 42; 43: 43; 44: 44; 45: 45; 46: 46; 47: 47; 48: 48; 49: 49; 50: 50; 51: 51; 52: 52; 53: 53; 54: 54; 55: 55; 56: 56; 57: 57; 58: 58; 59: 59; 60: 60; 61: 61; 62: 62; 63: 63; 64: 64; 65: 65; 66: 66; 67: 67; 68: 68; 69: 69; 70: 70; 71: 71; 72: 72; 73: 73; 74: 74; 75: 75; 76: 76; 77: 77; 78: 78; 79: 79; 80: 80; 81: 81; 82: 82; 83: 83; 84: 84; 85: 85; 86: 86; 87: 87; 88: 88; 89: 89; 90: 90; 91: 91; 92: 92; 93: 93; 94: 94; 95: 95; 96: 96; 97: 97; 98: 98; 99: 99; }; 2: { 0: 0; 1: 2; 2: 4; 3: 6; 4: 8; 5: 10; 6: 12; 7: 14; 8: 16; 9: 18; 10: 20; 11: 22; 12: 24; 13: 26; 14: 28; 15: 30; 16: 32; 17: 34; 18: 36; 19: 38; 20: 40; 21: 42; 22: 44; 23: 46; 24: 48; 25: 50; 26: 52; 27: 54; 28: 56; 29: 58; 30: 60; 31: 62; 32: 64; 33: 66; 34: 68; 35: 70; 36: 72; 37: 74; 38: 76; 39: 78; 40: 80; 41: 82; 42: 84; 43: 86; 44: 88; 45: 90; 46: 92; 47: 94; 48: 96; 49: 98; 50: 100; }; 3: { 0: 0; 1: 3; 2: 6; 3: 9; 4: 12; 5: 15; 6: 18; 7: 21; 8: 24; 9: 27; 10: 30; 11: 33; 12: 36; 13: 39; 14: 42; 15: 45; 16: 48; 17: 51; 18: 54; 19: 57; 20: 60; 21: 63; 22: 66; 23: 69; 24: 72; 25: 75; 26: 78; 27: 81; 28: 84; 29: 87; 30: 90; 31: 93; 32: 96; 33: 99; }; 4: { 0: 0; 1: 4; 2: 8; 3: 12; 4: 16; 5: 20; 6: 24; 7: 28; 8: 32; 9: 36; 10: 40; 11: 44; 12: 48; 13: 52; 14: 56; 15: 60; 16: 64; 17: 68; 18: 72; 19: 76; 20: 80; 21: 84; 22: 88; 23: 92; 24: 96; 25: 100; }; 5: { 0: 0; 1: 5; 2: 10; 3: 15; 4: 20; 5: 25; 6: 30; 7: 35; 8: 40; 9: 45; 10: 50; 11: 55; 12: 60; 13: 65; 14: 70; 15: 75; 16: 80; 17: 85; 18: 90; 19: 95; 20: 100; }; 6: { 0: 0; 1: 6; 2: 12; 3: 18; 4: 24; 5: 30; 6: 36; 7: 42; 8: 48; 9: 54; 10: 60; 11: 66; 12: 72; 13: 78; 14: 84; 15: 90; 16: 96; }; 7: { 0: 0; 1: 7; 2: 14; 3: 21; 4: 28; 5: 35; 6: 42; 7: 49; 8: 56; 9: 63; 10: 70; 11: 77; 12: 84; 13: 91; 14: 98; }; 8: { 0: 0; 1: 8; 2: 16; 3: 24; 4: 32; 5: 40; 6: 48; 7: 56; 8: 64; 9: 72; 10: 80; 11: 88; 12: 96; }; 9: { 0: 0; 1: 9; 2: 18; 3: 27; 4: 36; 5: 45; 6: 54; 7: 63; 8: 72; 9: 81; 10: 90; 11: 99; }; 10: { 0: 0; 1: 10; 2: 20; 3: 30; 4: 40; 5: 50; 6: 60; 7: 70; 8: 80; 9: 90; 10: 100; }; 11: { 0: 0; 1: 11; 2: 22; 3: 33; 4: 44; 5: 55; 6: 66; 7: 77; 8: 88; 9: 99; }; 12: { 0: 0; 1: 12; 2: 24; 3: 36; 4: 48; 5: 60; 6: 72; 7: 84; 8: 96; }; 13: { 0: 0; 1: 13; 2: 26; 3: 39; 4: 52; 5: 65; 6: 78; 7: 91; }; 14: { 0: 0; 1: 14; 2: 28; 3: 42; 4: 56; 5: 70; 6: 84; 7: 98; }; 15: { 0: 0; 1: 15; 2: 30; 3: 45; 4: 60; 5: 75; 6: 90; }; 16: { 0: 0; 1: 16; 2: 32; 3: 48; 4: 64; 5: 80; 6: 96; }; 17: { 0: 0; 1: 17; 2: 34; 3: 51; 4: 68; 5: 85; }; 18: { 0: 0; 1: 18; 2: 36; 3: 54; 4: 72; 5: 90; }; 19: { 0: 0; 1: 19; 2: 38; 3: 57; 4: 76; 5: 95; }; 20: { 0: 0; 1: 20; 2: 40; 3: 60; 4: 80; 5: 100; }; 21: { 0: 0; 1: 21; 2: 42; 3: 63; 4: 84; }; 22: { 0: 0; 1: 22; 2: 44; 3: 66; 4: 88; }; 23: { 0: 0; 1: 23; 2: 46; 3: 69; 4: 92; }; 24: { 0: 0; 1: 24; 2: 48; 3: 72; 4: 96; }; 25: { 0: 0; 1: 25; 2: 50; 3: 75; 4: 100; }; 26: { 0: 0; 1: 26; 2: 52; 3: 78; }; 27: { 0: 0; 1: 27; 2: 54; 3: 81; }; 28: { 0: 0; 1: 28; 2: 56; 3: 84; }; 29: { 0: 0; 1: 29; 2: 58; 3: 87; }; 30: { 0: 0; 1: 30; 2: 60; 3: 90; }; 31: { 0: 0; 1: 31; 2: 62; 3: 93; }; 32: { 0: 0; 1: 32; 2: 64; 3: 96; }; 33: { 0: 0; 1: 33; 2: 66; 3: 99; }; 34: { 0: 0; 1: 34; 2: 68; }; 35: { 0: 0; 1: 35; 2: 70; }; 36: { 0: 0; 1: 36; 2: 72; }; 37: { 0: 0; 1: 37; 2: 74; }; 38: { 0: 0; 1: 38; 2: 76; }; 39: { 0: 0; 1: 39; 2: 78; }; 40: { 0: 0; 1: 40; 2: 80; }; 41: { 0: 0; 1: 41; 2: 82; }; 42: { 0: 0; 1: 42; 2: 84; }; 43: { 0: 0; 1: 43; 2: 86; }; 44: { 0: 0; 1: 44; 2: 88; }; 45: { 0: 0; 1: 45; 2: 90; }; 46: { 0: 0; 1: 46; 2: 92; }; 47: { 0: 0; 1: 47; 2: 94; }; 48: { 0: 0; 1: 48; 2: 96; }; 49: { 0: 0; 1: 49; 2: 98; }; 50: { 0: 0; 1: 50; 2: 100; }; 51: { 0: 0; 1: 51; }; 52: { 0: 0; 1: 52; }; 53: { 0: 0; 1: 53; }; 54: { 0: 0; 1: 54; }; 55: { 0: 0; 1: 55; }; 56: { 0: 0; 1: 56; }; 57: { 0: 0; 1: 57; }; 58: { 0: 0; 1: 58; }; 59: { 0: 0; 1: 59; }; 60: { 0: 0; 1: 60; }; 61: { 0: 0; 1: 61; }; 62: { 0: 0; 1: 62; }; 63: { 0: 0; 1: 63; }; 64: { 0: 0; 1: 64; }; 65: { 0: 0; 1: 65; }; 66: { 0: 0; 1: 66; }; 67: { 0: 0; 1: 67; }; 68: { 0: 0; 1: 68; }; 69: { 0: 0; 1: 69; }; 70: { 0: 0; 1: 70; }; 71: { 0: 0; 1: 71; }; 72: { 0: 0; 1: 72; }; 73: { 0: 0; 1: 73; }; 74: { 0: 0; 1: 74; }; 75: { 0: 0; 1: 75; }; 76: { 0: 0; 1: 76; }; 77: { 0: 0; 1: 77; }; 78: { 0: 0; 1: 78; }; 79: { 0: 0; 1: 79; }; 80: { 0: 0; 1: 80; }; 81: { 0: 0; 1: 81; }; 82: { 0: 0; 1: 82; }; 83: { 0: 0; 1: 83; }; 84: { 0: 0; 1: 84; }; 85: { 0: 0; 1: 85; }; 86: { 0: 0; 1: 86; }; 87: { 0: 0; 1: 87; }; 88: { 0: 0; 1: 88; }; 89: { 0: 0; 1: 89; }; 90: { 0: 0; 1: 90; }; 91: { 0: 0; 1: 91; }; 92: { 0: 0; 1: 92; }; 93: { 0: 0; 1: 93; }; 94: { 0: 0; 1: 94; }; 95: { 0: 0; 1: 95; }; 96: { 0: 0; 1: 96; }; 97: { 0: 0; 1: 97; }; 98: { 0: 0; 1: 98; }; 99: { 0: 0; 1: 99; }; };