%I #8 Jun 19 2026 17:31:06
%S 1,64,3808,299773,24990111,2171041745
%N Number of free polyominoes with 4n cells that can be tiled by n copies of the L-tetromino; equivalently, the number of n-fold multiples of the L-tetromino, counted up to rotation and reflection.
%C In the divisibility language of Polyomino Number Theory (Cibulis, Liu, and Wainwright), a polyomino assembled from n copies of a polyomino P is an n-fold multiple of P. This sequence counts the distinct free n-fold multiples of the L-tetromino. The pieces may be placed in any of their orientations; copies must meet edge to edge and may not overlap.
%H A. Cibulis, A. Liu, and B. Wainwright, <a href="http://www.paulsalomon.com/uploads/2/8/3/3/28331113/polyomino_number_theory_(i).pdf">Polyomino Number Theory I</a>, Crux Mathematicorum 28(3) (2002), 147-150.
%H Solomon W. Golomb, <a href="https://www.jstor.org/stable/2320673">Normed Division Domains</a>, The American Mathematical Monthly, Vol. 88, No. 9 (Nov., 1981), pp. 680-686.
%H Haoyang Xu, <a href="/A397021/a397021.png">Illustration of a(1) and a(2)</a>
%e a(1) = 1 (the L-tetromino itself). a(2) = 64: two L-tetrominoes joined edge to edge form 64 distinct free octominoes.
%o (Python)
%o def _norm(s):
%o mx = min(x for x, y in s); my = min(y for x, y in s)
%o return frozenset((x - mx, y - my) for x, y in s)
%o def _orients(s):
%o out = set(); c = _norm(s)
%o for _ in range(4):
%o out.add(c)
%o out.add(_norm(frozenset((-x, y) for x, y in c)))
%o c = _norm(frozenset((-y, x) for x, y in c))
%o return out
%o def _canon(s):
%o return min(tuple(sorted(o)) for o in _orients(s))
%o def a(n, piece=frozenset({(0,0),(0,1),(0,2),(1,0)})):
%o states = {frozenset(_canon(list(_orients(piece))[0]))}
%o O = list(_orients(piece))
%o for _ in range(n - 1):
%o nxt = set()
%o for st in states:
%o xs = [x for x, y in st]; ys = [y for x, y in st]
%o for o in O:
%o ox = [p[0] for p in o]; oy = [p[1] for p in o]
%o for dx in range(min(xs)-max(ox)-1, max(xs)-min(ox)+2):
%o for dy in range(min(ys)-max(oy)-1, max(ys)-min(oy)+2):
%o t = frozenset((p[0]+dx, p[1]+dy) for p in o)
%o if t & st: continue
%o if any((x+1,y) in st or (x-1,y) in st or (x,y+1) in st or (x,y-1) in st for x,y in t):
%o nxt.add(st | t)
%o states = {frozenset(k) for k in {_canon(s) for s in nxt}}
%o return len(states)
%o print([a(n) for n in range(1, 5)]) # 1, 64, 3808, 299773
%o # larger terms by the parallel hash-sharded on-disk method. _Haoyang Xu_
%Y Cf. A390620 (O-column, free polynars), A000105 (free polyominoes); A397019 (I), A397020 (T), A397022 (S), A397023 (A390620 - A000105).
%K nonn,more,hard
%O 1,2
%A _Haoyang Xu_, Jun 13 2026