Problem Statement
The n variables we will use will be denoted by the first n uppercase English letters. For example, if n=3, our three variables are "A", "B", and "C".
The only operator allowed in this task is the implication, denoted "->". The implication "x->y" is True when both "x" and "y" are True. The implication "x->y" is also True whenever "x" is False, regardless of whether "y" is True or not. In other words, the implication "x->y" is only False if "x" is True and "y" is False.
The set of valid expressions is defined as follows:
- Each variable is a valid expression.
- If "P" and "Q" are valid expressions, "(P->Q)" is also a valid expression.
- An expression that cannot be constructed by repeatedly using the above rules is not valid.
For example, "A", "(A->A)", "(((P->Q)->P)->P)", and "((A->B)->(B->A))" are valid expressions (if the value of n is large enough). On the other hand, "(A)", "", and "A->B" are not valid expressions. Note that some variables may be unused. For example, "(A->C)" is a valid expression for n=4.
For a valid expression with n variables there are 2^n assignments of truth values to the variables. (Each of the n variables can be True or False.) Your task is to find a valid expression such that exactly k of these assignments make the expression True.
If there is no such expression, return "Impossible".
If there are multiple such expressions, you may return any of them. However, the length of your return value must not exceed 1000 characters. (It can be shown that whenever the answer is not "Impossible", there are suitable expressions that do not exceed 1000 characters.)
Definition
- Class:
- MaterialImplication
- Method:
- construct
- Parameters:
- int, int
- Returns:
- String
- Method signature:
- String construct(int n, int k)
- (be sure your method is public)
Constraints
- n will be between 1 and 20, inclusive.
- k will be between 0 and 2^n, inclusive.
Examples
1
1
Returns: "A"
When A = True, the expression is True. When A = False, the expression is False. So exactly 1 of them will be True.
2
4
Returns: "(A->A)"
The expression "(A->A)" is a tautology. This means that in all 2^2=4 assignments the expression will be True. Note that even though "B" does not appear in this expression, we still consider all 2^2 ways of assigning truth values to variables. There are other valid expressions. For example, "(((A->B)->A)->A)" is also a tautology called Peirce's law.
2
3
Returns: "(A->B)"
3
0
Returns: "Impossible"
There is no such expression. We can easily show that any valid expression is True if all three variables are True.
4
13
Returns: "(((A->B)->(C->D))->((A->C)->(D->B)))"
1
0
Returns: "Impossible"
1
1
Returns: "A"
1
2
Returns: "(A->A)"
2
0
Returns: "Impossible"
2
1
Returns: "Impossible"
2
2
Returns: "((B->B)->B)"
2
3
Returns: "(A->B)"
2
4
Returns: "(A->A)"
3
0
Returns: "Impossible"
3
1
Returns: "Impossible"
3
2
Returns: "Impossible"
3
3
Returns: "Impossible"
3
4
Returns: "((C->C)->C)"
3
5
Returns: "((((((C->C)->A)->B)->C)->C)->C)"
3
6
Returns: "((((C->C)->B)->C)->C)"
3
7
Returns: "((((((C->C)->A)->C)->B)->C)->C)"
3
8
Returns: "(A->A)"
4
0
Returns: "Impossible"
4
1
Returns: "Impossible"
4
2
Returns: "Impossible"
4
3
Returns: "Impossible"
4
4
Returns: "Impossible"
4
5
Returns: "Impossible"
4
6
Returns: "Impossible"
4
7
Returns: "Impossible"
4
8
Returns: "((D->D)->D)"
4
9
Returns: "((((((((D->D)->A)->B)->D)->C)->D)->D)->D)"
4
10
Returns: "((((((D->D)->B)->C)->D)->D)->D)"
4
11
Returns: "((((((((D->D)->A)->D)->B)->C)->D)->D)->D)"
4
12
Returns: "((((D->D)->C)->D)->D)"
4
13
Returns: "(((A->B)->(C->D))->((A->C)->(D->B)))"
4
14
Returns: "((((((D->D)->B)->D)->C)->D)->D)"
4
15
Returns: "((((((((D->D)->A)->D)->B)->D)->C)->D)->D)"
4
16
Returns: "(A->A)"
5
0
Returns: "Impossible"
5
1
Returns: "Impossible"
5
2
Returns: "Impossible"
5
3
Returns: "Impossible"
5
4
Returns: "Impossible"
5
5
Returns: "Impossible"
5
6
Returns: "Impossible"
5
7
Returns: "Impossible"
5
8
Returns: "Impossible"
5
9
Returns: "Impossible"
5
10
Returns: "Impossible"
5
11
Returns: "Impossible"
5
12
Returns: "Impossible"
5
13
Returns: "Impossible"
5
14
Returns: "Impossible"
5
15
Returns: "Impossible"
5
16
Returns: "((E->E)->E)"
5
17
Returns: "((((((((((E->E)->A)->B)->E)->C)->E)->D)->E)->E)->E)"
5
18
Returns: "((((((((E->E)->B)->C)->E)->D)->E)->E)->E)"
5
19
Returns: "((((((((((E->E)->A)->E)->B)->C)->E)->D)->E)->E)->E)"
5
20
Returns: "((((((E->E)->C)->D)->E)->E)->E)"
5
21
Returns: "((((((((((E->E)->A)->B)->E)->E)->C)->D)->E)->E)->E)"
5
22
Returns: "((((((((E->E)->B)->E)->C)->D)->E)->E)->E)"
5
23
Returns: "((((((((((E->E)->A)->E)->B)->E)->C)->D)->E)->E)->E)"
5
24
Returns: "((((E->E)->D)->E)->E)"
5
25
Returns: "((((((((((E->E)->A)->B)->E)->C)->E)->E)->D)->E)->E)"
5
26
Returns: "((((((((E->E)->B)->C)->E)->E)->D)->E)->E)"
5
27
Returns: "((((((((((E->E)->A)->E)->B)->C)->E)->E)->D)->E)->E)"
5
28
Returns: "((((((E->E)->C)->E)->D)->E)->E)"
5
29
Returns: "((((((((((E->E)->A)->B)->E)->E)->C)->E)->D)->E)->E)"
5
30
Returns: "((((((((E->E)->B)->E)->C)->E)->D)->E)->E)"
5
31
Returns: "((((((((((E->E)->A)->E)->B)->E)->C)->E)->D)->E)->E)"
5
32
Returns: "(A->A)"
9
441
Returns: "((((((((((((((((((I->I)->A)->B)->I)->C)->I)->I)->D)->I)->E)->I)->F)->G)->I)->I)->H)->I)->I)"
12
3049
Returns: "((((((((((((((((((((((((L->L)->A)->B)->L)->C)->L)->L)->D)->E)->L)->L)->F)->L)->G)->L)->H)->L)->I)->L)->J)->K)->L)->L)->L)"
11
319
Returns: "Impossible"
11
1498
Returns: "((((((((((((((((((((K->K)->B)->C)->K)->K)->D)->K)->E)->F)->K)->K)->G)->K)->H)->K)->I)->J)->K)->K)->K)"
20
878353
Returns: "((((((((((((((((((((((((((((((((((((((((T->T)->A)->B)->T)->C)->T)->D)->T)->T)->E)->F)->T)->G)->T)->H)->T)->T)->I)->T)->J)->T)->K)->L)->T)->M)->T)->T)->N)->T)->O)->P)->T)->T)->Q)->R)->T)->T)->S)->T)->T)"
8
130
Returns: "((((((((((((((H->H)->B)->C)->H)->D)->H)->E)->H)->F)->H)->G)->H)->H)->H)"
17
44385
Returns: "Impossible"
11
2043
Returns: "((((((((((((((((((((((K->K)->A)->K)->B)->C)->K)->K)->D)->K)->E)->K)->F)->K)->G)->K)->H)->K)->I)->K)->J)->K)->K)"
7
12
Returns: "Impossible"
9
42
Returns: "Impossible"
11
1686
Returns: "((((((((((((((((((((K->K)->B)->K)->C)->D)->K)->K)->E)->F)->K)->G)->K)->K)->H)->I)->K)->K)->J)->K)->K)"
7
84
Returns: "((((((((((G->G)->C)->D)->G)->G)->E)->F)->G)->G)->G)"
20
629017
Returns: "((((((((((((((((((((((((((((((((((((((((T->T)->A)->B)->T)->C)->T)->T)->D)->T)->E)->F)->T)->G)->T)->H)->T)->T)->I)->J)->T)->K)->T)->T)->L)->T)->M)->N)->T)->O)->T)->T)->P)->T)->Q)->R)->T)->S)->T)->T)->T)"
15
10580
Returns: "Impossible"
8
137
Returns: "((((((((((((((((H->H)->A)->B)->H)->C)->H)->H)->D)->E)->H)->F)->H)->G)->H)->H)->H)"
9
161
Returns: "Impossible"
15
27901
Returns: "((((((((((((((((((((((((((((((O->O)->A)->B)->O)->O)->C)->O)->D)->O)->E)->O)->F)->O)->G)->O)->H)->I)->O)->J)->O)->O)->K)->O)->L)->M)->O)->O)->N)->O)->O)"
10
1011
Returns: "((((((((((((((((((((J->J)->A)->J)->B)->C)->J)->D)->J)->J)->E)->J)->F)->J)->G)->J)->H)->J)->I)->J)->J)"
13
748
Returns: "Impossible"
12
252
Returns: "Impossible"
19
23529
Returns: "Impossible"
10
762
Returns: "((((((((((((((((((J->J)->B)->C)->J)->J)->D)->J)->E)->J)->F)->J)->G)->J)->H)->I)->J)->J)->J)"
12
2670
Returns: "((((((((((((((((((((((L->L)->B)->L)->C)->L)->D)->E)->L)->L)->F)->L)->G)->H)->L)->I)->L)->L)->J)->K)->L)->L)->L)"
8
203
Returns: "((((((((((((((((H->H)->A)->H)->B)->C)->H)->H)->D)->E)->H)->F)->H)->H)->G)->H)->H)"
11
1807
Returns: "((((((((((((((((((((((K->K)->A)->K)->B)->K)->C)->K)->D)->E)->K)->F)->K)->G)->K)->H)->K)->K)->I)->K)->J)->K)->K)"
12
3610
Returns: "((((((((((((((((((((((L->L)->B)->C)->L)->L)->D)->L)->E)->F)->L)->G)->L)->H)->L)->I)->L)->L)->J)->L)->K)->L)->L)"
10
559
Returns: "((((((((((((((((((((J->J)->A)->J)->B)->J)->C)->J)->D)->E)->J)->J)->F)->G)->J)->H)->J)->I)->J)->J)->J)"
13
837
Returns: "Impossible"
11
756
Returns: "Impossible"
16
34605
Returns: "((((((((((((((((((((((((((((((((P->P)->A)->B)->P)->P)->C)->P)->D)->E)->P)->P)->F)->G)->P)->H)->P)->P)->I)->P)->J)->P)->K)->L)->P)->M)->P)->N)->P)->O)->P)->P)->P)"
19
44679
Returns: "Impossible"
17
119471
Returns: "((((((((((((((((((((((((((((((((((Q->Q)->A)->Q)->B)->Q)->C)->Q)->D)->E)->Q)->Q)->F)->G)->Q)->Q)->H)->I)->Q)->Q)->J)->K)->Q)->L)->Q)->Q)->M)->N)->Q)->Q)->O)->Q)->P)->Q)->Q)"
14
7544
Returns: "Impossible"
9
161
Returns: "Impossible"
12
1470
Returns: "Impossible"
11
2007
Returns: "((((((((((((((((((((((K->K)->A)->K)->B)->K)->C)->D)->K)->K)->E)->F)->K)->K)->G)->K)->H)->K)->I)->K)->J)->K)->K)"
20
384601
Returns: "Impossible"
18
26903
Returns: "Impossible"
9
124
Returns: "Impossible"
20
224550
Returns: "Impossible"
16
14802
Returns: "Impossible"
7
44
Returns: "Impossible"
7
72
Returns: "((((((((G->G)->D)->E)->G)->F)->G)->G)->G)"
13
7881
Returns: "((((((((((((((((((((((((((M->M)->A)->B)->M)->C)->M)->M)->D)->E)->M)->F)->M)->M)->G)->M)->H)->I)->M)->M)->J)->M)->K)->M)->L)->M)->M)"
8
16
Returns: "Impossible"
19
13627
Returns: "Impossible"
12
3204
Returns: "((((((((((((((((((((L->L)->C)->D)->L)->E)->L)->F)->L)->G)->L)->L)->H)->I)->L)->J)->L)->L)->K)->L)->L)"
14
10965
Returns: "((((((((((((((((((((((((((((N->N)->A)->B)->N)->N)->C)->D)->N)->N)->E)->F)->N)->N)->G)->N)->H)->I)->N)->N)->J)->K)->N)->N)->L)->M)->N)->N)->N)"
13
343
Returns: "Impossible"
12
1643
Returns: "Impossible"
17
33507
Returns: "Impossible"
18
13357
Returns: "Impossible"
18
255470
Returns: "((((((((((((((((((((((((((((((((((R->R)->B)->R)->C)->R)->D)->E)->R)->R)->F)->R)->G)->R)->H)->R)->I)->J)->R)->R)->K)->L)->R)->M)->R)->R)->N)->R)->O)->R)->P)->R)->Q)->R)->R)"
19
302344
Returns: "((((((((((((((((((((((((((((((((S->S)->D)->E)->S)->F)->S)->G)->S)->H)->S)->S)->I)->J)->S)->S)->K)->S)->L)->S)->M)->N)->S)->O)->S)->S)->P)->Q)->S)->R)->S)->S)->S)"
20
443994
Returns: "Impossible"
20
592287
Returns: "((((((((((((((((((((((((((((((((((((((((T->T)->A)->T)->B)->T)->C)->T)->D)->T)->E)->F)->T)->G)->T)->T)->H)->T)->I)->J)->T)->K)->T)->T)->L)->M)->T)->N)->T)->O)->T)->P)->T)->T)->Q)->R)->T)->S)->T)->T)->T)"
18
103874
Returns: "Impossible"
13
1011
Returns: "Impossible"
10
720
Returns: "((((((((((((J->J)->E)->F)->J)->J)->G)->J)->H)->I)->J)->J)->J)"
16
15439
Returns: "Impossible"
9
319
Returns: "((((((((((((((((((I->I)->A)->I)->B)->I)->C)->I)->D)->I)->E)->I)->F)->G)->I)->H)->I)->I)->I)"
17
102278
Returns: "((((((((((((((((((((((((((((((((Q->Q)->B)->Q)->C)->D)->Q)->E)->Q)->F)->Q)->G)->Q)->Q)->H)->Q)->I)->Q)->J)->Q)->K)->Q)->L)->M)->Q)->N)->Q)->O)->Q)->Q)->P)->Q)->Q)"
18
6682
Returns: "Impossible"
16
19861
Returns: "Impossible"
15
13325
Returns: "Impossible"
11
1753
Returns: "((((((((((((((((((((((K->K)->A)->B)->K)->C)->K)->K)->D)->K)->E)->F)->K)->K)->G)->K)->H)->I)->K)->K)->J)->K)->K)"
8
183
Returns: "((((((((((((((((H->H)->A)->H)->B)->H)->C)->D)->H)->H)->E)->H)->F)->G)->H)->H)->H)"
8
57
Returns: "Impossible"
9
249
Returns: "Impossible"
8
202
Returns: "((((((((((((((H->H)->B)->C)->H)->H)->D)->E)->H)->F)->H)->H)->G)->H)->H)"
19
246339
Returns: "Impossible"
18
258759
Returns: "((((((((((((((((((((((((((((((((((((R->R)->A)->R)->B)->R)->C)->D)->R)->E)->R)->F)->R)->R)->G)->R)->H)->I)->R)->R)->J)->K)->R)->L)->R)->R)->M)->R)->N)->R)->O)->R)->P)->R)->Q)->R)->R)"
10
50
Returns: "Impossible"
18
79539
Returns: "Impossible"
7
87
Returns: "((((((((((((((G->G)->A)->G)->B)->G)->C)->D)->G)->G)->E)->F)->G)->G)->G)"
17
30641
Returns: "Impossible"
19
415307
Returns: "((((((((((((((((((((((((((((((((((((((S->S)->A)->S)->B)->C)->S)->S)->D)->E)->S)->F)->S)->S)->G)->H)->S)->I)->S)->S)->J)->S)->K)->L)->S)->S)->M)->N)->S)->S)->O)->P)->S)->Q)->S)->S)->R)->S)->S)"
17
49742
Returns: "Impossible"
20
22316
Returns: "Impossible"
18
83401
Returns: "Impossible"
7
123
Returns: "((((((((((((((G->G)->A)->G)->B)->C)->G)->G)->D)->G)->E)->G)->F)->G)->G)"
15
23340
Returns: "((((((((((((((((((((((((((O->O)->C)->O)->D)->E)->O)->O)->F)->G)->O)->H)->O)->O)->I)->O)->J)->K)->O)->O)->L)->O)->M)->N)->O)->O)->O)"
9
208
Returns: "Impossible"
15
8162
Returns: "Impossible"
15
3907
Returns: "Impossible"
13
5913
Returns: "((((((((((((((((((((((((((M->M)->A)->B)->M)->C)->M)->M)->D)->M)->E)->F)->M)->G)->M)->H)->M)->M)->I)->M)->J)->M)->K)->L)->M)->M)->M)"
7
121
Returns: "((((((((((((((G->G)->A)->B)->G)->C)->G)->G)->D)->G)->E)->G)->F)->G)->G)"
13
4364
Returns: "((((((((((((((((((((((M->M)->C)->M)->D)->E)->M)->F)->M)->G)->M)->H)->M)->M)->I)->J)->M)->K)->M)->L)->M)->M)->M)"
13
2026
Returns: "Impossible"
17
21149
Returns: "Impossible"
16
6172
Returns: "Impossible"
12
624
Returns: "Impossible"
10
171
Returns: "Impossible"
13
3210
Returns: "Impossible"
16
60357
Returns: "((((((((((((((((((((((((((((((((P->P)->A)->B)->P)->P)->C)->D)->P)->E)->P)->F)->P)->P)->G)->P)->H)->P)->I)->P)->J)->K)->P)->P)->L)->M)->P)->P)->N)->P)->O)->P)->P)"
20
922747
Returns: "((((((((((((((((((((((((((((((((((((((((T->T)->A)->T)->B)->C)->T)->T)->D)->T)->E)->T)->F)->T)->G)->H)->T)->I)->T)->J)->T)->T)->K)->L)->T)->T)->M)->N)->T)->O)->T)->P)->T)->Q)->T)->T)->R)->T)->S)->T)->T)"
9
169
Returns: "Impossible"
9
46
Returns: "Impossible"
12
1686
Returns: "Impossible"
14
6226
Returns: "Impossible"
20
0
Returns: "Impossible"
20
1024
Returns: "Impossible"
20
1023
Returns: "Impossible"
20
1025
Returns: "Impossible"
20
524287
Returns: "Impossible"
20
524288
Returns: "((T->T)->T)"
20
524289
Returns: "((((((((((((((((((((((((((((((((((((((((T->T)->A)->B)->T)->C)->T)->D)->T)->E)->T)->F)->T)->G)->T)->H)->T)->I)->T)->J)->T)->K)->T)->L)->T)->M)->T)->N)->T)->O)->T)->P)->T)->Q)->T)->R)->T)->S)->T)->T)->T)"
20
1048576
Returns: "(A->A)"
20
1048575
Returns: "((((((((((((((((((((((((((((((((((((((((T->T)->A)->T)->B)->T)->C)->T)->D)->T)->E)->T)->F)->T)->G)->T)->H)->T)->I)->T)->J)->T)->K)->T)->L)->T)->M)->T)->N)->T)->O)->T)->P)->T)->Q)->T)->R)->T)->S)->T)->T)"
20
1048574
Returns: "((((((((((((((((((((((((((((((((((((((T->T)->B)->T)->C)->T)->D)->T)->E)->T)->F)->T)->G)->T)->H)->T)->I)->T)->J)->T)->K)->T)->L)->T)->M)->T)->N)->T)->O)->T)->P)->T)->Q)->T)->R)->T)->S)->T)->T)"
20
800000
Returns: "((((((((((((((((((((((((T->T)->I)->J)->T)->T)->K)->L)->T)->T)->M)->T)->N)->O)->T)->P)->T)->Q)->T)->R)->T)->T)->S)->T)->T)"
20
1000000
Returns: "((((((((((((((((((((((((((((T->T)->G)->H)->T)->I)->T)->T)->J)->K)->T)->L)->T)->M)->T)->N)->T)->T)->O)->P)->T)->T)->Q)->T)->R)->T)->S)->T)->T)"
20
531602
Returns: "((((((((((((((((((((((((((((((((((((((T->T)->B)->C)->T)->D)->T)->T)->E)->F)->T)->G)->T)->T)->H)->I)->T)->J)->T)->T)->K)->T)->L)->T)->M)->N)->T)->O)->T)->P)->T)->Q)->T)->R)->T)->S)->T)->T)->T)"
20
751309
Returns: "((((((((((((((((((((((((((((((((((((((((T->T)->A)->B)->T)->T)->C)->T)->D)->E)->T)->F)->T)->T)->G)->T)->H)->I)->T)->T)->J)->T)->K)->L)->T)->T)->M)->T)->N)->T)->O)->P)->T)->T)->Q)->T)->R)->S)->T)->T)->T)"