EchoXSpaceИсправил.
Если “Камни можно свободно двигать по нитке” значит,
'aab', ‘aba’, ‘baa’ <= одно и тоже ?
Все таки формулу вывести правильней.
EchoXSpaceИсправил.
import string from itertools import product def count_neck(n,k): make_neck = (neck for neck in product(string.hexdigits[:k],repeat=n)) assert 0 < n*k < 33 class Necklace: def __init__(self): self.neck = next(make_neck) def __eq__(self,other): return hash(self) == hash(other) or self.neck == tuple(reversed(other.neck)) def __hash__(self): return reduce(lambda x,y : x*int(''.join(self.neck[y:] + self.neck[:y]),k),range(n),1) return len({Necklace() for num in range(k**n)}) if n > 1 else k

from functools import reduce
. Вот проще без изъебствimport string from itertools import product def count_neck(n,k): assert 0 < n*k < 33 s = set() res = 0 for neck in product(string.ascii_letters[:k],repeat=n): if neck not in s: res +=1 for m in range(n): s.add(neck[m:] + neck[:m]) s.add(tuple(reversed(neck))) return res print(count_neck(5,2))
import string from itertools import product def count_neck(n,k): assert 0 < n*k < 33 s = set() res = 0 for neck in product(string.ascii_letters[:k],repeat=n): if neck not in s: res +=1 for m in range(n): shifted = neck[m:] + neck[:m] s.add(shifted) s.add(tuple(reversed(shifted))) return res for k in range(2,4): for n in range(1,16): print('{} {} --> {}'.format(n,k,count_neck(n,k)))