O period
de uma string é o menor deslocamento diferente de zero, para que a string corresponda a si mesma, ignorando quaisquer partes que excedam. Então, por exemplo, abcabcab
tem período 3
. Por convenção, dizemos que, se não houver essa mudança, uma sequência terá um período igual ao seu comprimento. Portanto, o período de abcde
é 5
e o período de a
é 1
.
Em termos mais formais, o período de uma string S
é o mínimo i > 0
para que S[1,n-i] == S[i+1,n]
(indexando de 1
).
Para uma determinada sequência S de potência de dois comprimentos, calcularemos o período de todos os seus prefixos de potência de dois comprimentos. Por exemplo, considere S = abcabcab
. Os períodos que calcularemos são:
'a', 1
'ab', 2
'abca', 3
'abcabcab', 3
Na verdade, apenas produziremos a matriz de períodos, ou seja [1, 2, 3, 3]
.
Para um determinado poder positivo de dois n
, considere todas as seqüências binárias possíveis S
. Lembre-se de que uma cadeia binária é simplesmente uma cadeia de se 1
es, 0
para que exista exatamente 2^n
essas cadeias (ou seja, 2
a potência n
). Para cada um, podemos calcular esse conjunto de períodos.
O desafio é escrever um código que tome
n
(um poder de dois) como entrada e calcule quantas matrizes distintas existem.
As respostas para n = 1, 2, 4, 8, 16, 32, 64, 128
são:
1, 2, 6, 32, 320, 6025, 216854, 15128807
O conjunto completo de matrizes de período distintas para n = 4
é:
1, 1, 1
1, 1, 3
1, 1, 4
1, 2, 2
1, 2, 3
1, 2, 4
Ponto
Vou executar o seu código no meu computador executando o Ubuntu por 10 minutos. Sua pontuação é a maior n
para a qual seu código termina nesse período. Em caso de empate, a resposta que completa as maiores n
vitórias mais rápidas conjuntas . No caso de empate em 1 segundo nos horários, a primeira resposta postada vence.
Línguas e bibliotecas
Você pode usar qualquer idioma e bibliotecas disponíveis que desejar. Por favor, inclua uma explicação completa de como executar / compilar seu código no Linux, se possível.
Seu código deve realmente calcular as respostas e não, por exemplo, apenas gerar valores pré-computados.
Entradas principais
- 2 minutos e 21 segundos para n = 128 em C # por Peter Taylor
- 9 segundos para n = 32 em Rust por isaacg
n
, você o aceitaria? Não está bem definido onde está a fronteira entre a codificação e a computação real.
abcab
. Todas, exceto as últimas 3 letras, são abcab
. Eles correspondem e remover um número menor de letras não corresponde.