Desafio
Vamos imaginar um número N
múltiplo de números inteiros entre 0 e M
inclusivo, e vamos chamá-lo F
.
Existem s (M + 1) ** N
possíveis F
no total.
Quantos desses F
s satisfazem todas as seguintes desigualdades (o índice é baseado em um)?
F[n] + F[n+1] <= M
para1 <= n < N
F[N] + F[1] <= M
Escreva um programa ou função que leva dois inteiros positivos N
e M
e envia a resposta de qualquer forma conveniente.
Casos de teste
(N,M) => Answer
(1,1) => 1
(2,1) => 3
(3,1) => 4
(4,1) => 7
(1,2) => 2
(2,2) => 6
(3,2) => 11
(4,2) => 26
(10,3) => 39175
(10,4) => 286555
(10,5) => 1508401
(25,3) => 303734663372
(25,4) => 43953707972058
(25,5) => 2794276977562073
(100,3) => 8510938110502117856062697655362747468175263710
(100,4) => 3732347514675901732382391725971022481763004479674972370
(100,5) => 60964611448369808046336702581873778457326750953325742021695001
Explicação
M (max value of element) = 1
F[1] + F[1] <= 1; F = [0]
(1,1) => 1
F[1] + F[2] <= 1; F = [0,0], [0,1], [1,0]
(2,1) => 3
F = [0,0,0], [0,0,1], [0,1,0], [1,0,0]
(3,1) => 4
F = [0,0,0,0], [0,0,0,1], [0,0,1,0], [0,1,0,0], [0,1,0,1], [1,0,0,0], [1,0,1,0]
(4,1) => 7
---
M = 2
F[1] + F[1] <= 2; F = [0], [1]
(1,2) => 2
F = [0,0], [0,1], [0,2], [1,0], [1,1], [2,0]
(2,2) => 6
F = [0,0,0], [0,0,1], [0,0,2], [0,1,0], [0,1,1], [0,2,0], [1,0,0], [1,0,1],
[1,1,0], [1,1,1], [2,0,0]
(3,2) => 11
(4,2) => 26 (left as exercise for you)
Regras
- Este é um desafio de complexidade restrita . A complexidade do tempo do seu código deve ser polinomial
M
eN
(por exemplo, você não pode gerar todas as(M + 1) ** N
tuplas e verificar a condição). Por favor, explique sua abordagem ao enviar. - Aplicam-se as regras de código-golfe padrão . A resposta mais curta em bytes vence.
code-golf
restricted-complexity
Bubbler
fonte
fonte
mat(...,int)
não parece funcionar para osn=100
casos. O método é correta (usando SymPy para somar as potências das raízes do polinômio característico funciona, por exemplo), mas numpy vai em algum lugar errado, como os números aumentam (talvez seja o**
operador de potência?)Pitão , 27 bytes
Demonstração
Espera entrada no formato:
Essa é uma programação dinâmica clássica, na extremidade esquerda dos valores definidos até agora, na extremidade direita e no tamanho atual da lacuna.
Como funciona, no pseudocódigo / Python:
Q
é usado paraM
,z
é usado paraN
,:
éfill
,N
éleft
,T
éright
,Y
égap
.fonte
MATL ,
1312 bytesExperimente online! Esta é uma tradução direta da resposta Python do xnor e da minha primeira resposta MATL, portanto, provavelmente não é o ideal. Por exemplo, é provável que haja uma maneira mais curta de obter uma matriz triangular superior esquerda do que
t&lYRP
. Edit: E acontece que existe, a saber:&>~P
. Obrigado a Luis Mendo por -1 byte!fonte
Stax , 17 bytes
Execute e depure
Descompactado, não jogado e comentado, parece com isso.
Execute este
fonte
R , 72 bytes
Experimente online!
Portos abordagem xnor.
Falha em casos de teste maiores, já que o R tem apenas suporte inteiro de 32 bits (eles são convertidos para
double
quando o valor máximo de int for atingido), portanto,gmp
seria necessário o uso de outra biblioteca aritmética de precisão arbitrária.Estranhamente, R não possui um operador de matriz, como
^
sempre se aplica aos elementos.fonte
%^%
operador corretamente implementado no pacoteexpm
que permitiria -5 bytes , mas, infelizmente, ele não está disponível no TIO (eu tive que testar localmente).function(M,N)sum(diag(expm::`%^%`(outer(0:M,0:M,"+")<=M,N)))