Meu problema. Dada , quero contar o número de válido multisets . Um multiset é válido se
- A soma dos elementos de é , e
- Cada número de a pode ser expressa de forma única como uma soma de alguns dos elementos de .
Exemplo. Por exemplo, se , são válidos.
No entanto, é inválido porque 2 pode ser formado por e (ou seja, 2 pode ser expresso como e ) , portanto, a segunda condição não é válida. Da mesma forma 3 pode ser formado por e .
} também é inválido porque todos os números de a podem ser feitos exclusivamente, mas a soma dos elementos de não é .
Eu tentei encontrar um bom algoritmo para esse problema por algum tempo, mas não consigo resolvê-lo. É de codechef . Eu já vi algumas das soluções enviadas, mas ainda não consegui obter a lógica para resolver o problema. NOTA: O limite de tempo para a pergunta é de 10 segundos e
Para um multiset, usarei a notação se , o que significa ocorre vezes na multiconjunto S.
Até agora eu tirei algumas conclusões
- O primeiro elemento do multiset classificado necessário deve ser
- Seja é um conjunto seguindo as duas propriedades, então ∀ r < k a r + 1 = a r ou ( ∑ r i = 0 a i ) + 1
- Seja , onde a i ocorre c i vezes, segue as propriedades necessárias e, a partir da conclusão acima, podemos dizer que ∀ i a i | n + 1 e se j > i .
Prova: a i + 1 = ( a i c i + a i - 1 ) + 1 ⇒ a i | a i + 1
- Agora, considere ou seja, todo o os números subseqüentes após 1 serão múltiplos de d . Então vamos f ( n )seja possível a contagem desse multiset, então onde estou somando todo o número possível de1's(=d-1). Em outros termosf(n-1)=g(n)=∑d| n,d≠ng(d)
Finalmente, meu problema é reduzido a isso - encontre maneira eficiente para que não exceda o limite de tempo.