from time import*
from fractions import*
from collections import*
from itertools import*
def solve1a():
dotprod = lambda A,B: sum(a*b for a,b in zip(A,B))
for n in xrange(1,7):
numer=0
for A in product([1,-1],repeat=n):
for B in product([1,0,0,-1],repeat=n):
if not dotprod(A,B):
if not dotprod(A[1:]+A[:1],B):
numer+=1
denom=8**n
print n,Fraction(numer,denom)
solve1a()
def solve1b():
for n in xrange(1,8):
def f(i,a,b,s,t):
if i==n:
return not s and not t+a*b
res=0
for A in 1,-1:
for B in 1,0,0,-1:
res+=f(i+1,a,B,s+A*B,t+A*b)
return res
numer=0
for a in 1,-1:
for b in 1,0,0,-1:
numer+=f(1,a,b,a*b,0)
denom=8**n
print n,Fraction(numer,denom)
solve1b()
def solve2a():
dotprod = lambda A,B: sum(a*b for a,b in zip(A,B))
for n in xrange(2,7):
numer=0
for A in product([1,-1],repeat=n):
for B in product([1,0,0,-1],repeat=n):
if not dotprod(A,B):
if not dotprod(A[1:]+A[:1],B):
if not dotprod(A[2:]+A[:2],B):
numer+=1
denom=8**n
print n,Fraction(numer,denom)
solve2a()
def solve2b():
for n in xrange(2,8):
def f(i,a1,a2,b1,b2,s,t,u):
if i==n:
return not s and not t+a1*b2 and not u+a1*b1+a2*b2
res=0
for A in 1,-1:
for B in 1,0,0,-1:
res+=f(i+1,a1,a2,b2,B,s+A*B,t+A*b2,u+A*b1)
return res
numer=0
for a1 in 1,-1:
for b1 in 1,0,0,-1:
for a2 in 1,-1:
for b2 in 1,0,0,-1:
numer+=f(2,a1,a2,b1,b2,a1*b1+a2*b2,a2*b1,0)
denom=8**n
print n,Fraction(numer,denom)
solve2b()
ZnJvbSB0aW1lIGltcG9ydCoKZnJvbSBmcmFjdGlvbnMgaW1wb3J0Kgpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCoKZnJvbSBpdGVydG9vbHMgaW1wb3J0KgoKZGVmIHNvbHZlMWEoKToKCWRvdHByb2QgPSBsYW1iZGEgQSxCOiBzdW0oYSpiIGZvciBhLGIgaW4gemlwKEEsQikpCgkKCWZvciBuIGluIHhyYW5nZSgxLDcpOgoJCW51bWVyPTAKCQlmb3IgQSBpbiBwcm9kdWN0KFsxLC0xXSxyZXBlYXQ9bik6CgkJCWZvciBCIGluIHByb2R1Y3QoWzEsMCwwLC0xXSxyZXBlYXQ9bik6CgkJCQlpZiBub3QgZG90cHJvZChBLEIpOgoJCQkJCWlmIG5vdCBkb3Rwcm9kKEFbMTpdK0FbOjFdLEIpOgoJCQkJCQludW1lcis9MQoJCWRlbm9tPTgqKm4KCQlwcmludCBuLEZyYWN0aW9uKG51bWVyLGRlbm9tKQoKc29sdmUxYSgpCgpkZWYgc29sdmUxYigpOgoJZm9yIG4gaW4geHJhbmdlKDEsOCk6CgkJZGVmIGYoaSxhLGIscyx0KToKCQkJaWYgaT09bjoKCQkJCXJldHVybiBub3QgcyBhbmQgbm90IHQrYSpiCgkJCQoJCQlyZXM9MAoJCQkKCQkJZm9yIEEgaW4gMSwtMToKCQkJCWZvciBCIGluIDEsMCwwLC0xOgoJCQkJCXJlcys9ZihpKzEsYSxCLHMrQSpCLHQrQSpiKQoJCQkKCQkJcmV0dXJuIHJlcwoJCQoJCW51bWVyPTAKCQkKCQlmb3IgYSBpbiAxLC0xOgoJCQlmb3IgYiBpbiAxLDAsMCwtMToKCQkJCW51bWVyKz1mKDEsYSxiLGEqYiwwKQoJCQoJCWRlbm9tPTgqKm4KCQkKCQlwcmludCBuLEZyYWN0aW9uKG51bWVyLGRlbm9tKQoKc29sdmUxYigpCgpkZWYgc29sdmUyYSgpOgoJZG90cHJvZCA9IGxhbWJkYSBBLEI6IHN1bShhKmIgZm9yIGEsYiBpbiB6aXAoQSxCKSkKCQoJZm9yIG4gaW4geHJhbmdlKDIsNyk6CgkJbnVtZXI9MAoJCWZvciBBIGluIHByb2R1Y3QoWzEsLTFdLHJlcGVhdD1uKToKCQkJZm9yIEIgaW4gcHJvZHVjdChbMSwwLDAsLTFdLHJlcGVhdD1uKToKCQkJCWlmIG5vdCBkb3Rwcm9kKEEsQik6CgkJCQkJaWYgbm90IGRvdHByb2QoQVsxOl0rQVs6MV0sQik6CgkJCQkJCWlmIG5vdCBkb3Rwcm9kKEFbMjpdK0FbOjJdLEIpOgoJCQkJCQkJbnVtZXIrPTEKCQlkZW5vbT04KipuCgkJcHJpbnQgbixGcmFjdGlvbihudW1lcixkZW5vbSkKCnNvbHZlMmEoKQoKZGVmIHNvbHZlMmIoKToKCWZvciBuIGluIHhyYW5nZSgyLDgpOgoJCWRlZiBmKGksYTEsYTIsYjEsYjIscyx0LHUpOgoJCQlpZiBpPT1uOgoJCQkJcmV0dXJuIG5vdCBzIGFuZCBub3QgdCthMSpiMiBhbmQgbm90IHUrYTEqYjErYTIqYjIKCQkJCgkJCXJlcz0wCgkJCQoJCQlmb3IgQSBpbiAxLC0xOgoJCQkJZm9yIEIgaW4gMSwwLDAsLTE6CgkJCQkJcmVzKz1mKGkrMSxhMSxhMixiMixCLHMrQSpCLHQrQSpiMix1K0EqYjEpCgkJCQoJCQlyZXR1cm4gcmVzCgkJCgkJbnVtZXI9MAoJCQoJCWZvciBhMSBpbiAxLC0xOgoJCQlmb3IgYjEgaW4gMSwwLDAsLTE6CgkJCQlmb3IgYTIgaW4gMSwtMToKCQkJCQlmb3IgYjIgaW4gMSwwLDAsLTE6CgkJCQkJCW51bWVyKz1mKDIsYTEsYTIsYjEsYjIsYTEqYjErYTIqYjIsYTIqYjEsMCkKCQkKCQlkZW5vbT04KipuCgkJCgkJcHJpbnQgbixGcmFjdGlvbihudW1lcixkZW5vbSkKCnNvbHZlMmIoKQ==