Il mio problema. Dato , voglio contare il numero di multinsiemi valida S . Una multiset S è valida se
- La somma degli elementi di è , e
- Ogni numero da a n può essere espresso in modo univoco come somma di alcuni degli elementi di S .
Esempio. Ad esempio, se allora sono validi { 1 , 1 , 1 , 1 , 1 } , { 1 , 2 , 2 } , { 1 , 1 , 3 } .
Tuttavia, non è valido perché 2 può essere formato da { 1 , 1 } e { 2 } (ovvero, 2 può essere espresso come 2 = 1 + 1 e 2 = 2 ) , quindi la seconda condizione non regge. Allo stesso modo 3 può essere formato da { 2 , 1 } e { 1 , 1 , 1 } .
} non è valido perché tutti i numeri da 1 a 5 possono essere creati in modo univoco, ma la somma degli elementi di S non è 5 .
Ho provato a trovare un buon algoritmo per questo problema per un po 'di tempo ma non riesco a risolverlo. Viene da codechef . Ho visto alcune delle soluzioni presentate ma non riuscivo ancora a ottenere la logica per risolvere il problema. NOTA: il limite di tempo per la domanda è di 10 secondi e
Per un multiset userò la notazione Un i < un j se i < j , il che significa un i verifica c i tempi in multinsieme S.
Fino ad ora ho tratto alcune conclusioni
- Il primo elemento del multiset ordinato richiesto dovrebbe essere
- Sia essere un insieme seguendo le due proprietà quindi ∀ r < k a r + 1 = a r oppure ( ∑ r i = 0 a i ) + 1
- Sia , dove un mi sta verificando c i tempi, segue le proprietà richieste quindi dalla conclusione sopra possiamo dire che ∀ i un i | n + 1 e se j > i .
Prova: a i + 1 = ( a i c i + a i - 1 ) + 1 ⇒ a i | a i + 1
- Ora considera cioè tutti i i numeri successivi dopo 1 saranno un multiplo di d . Quindi lascia che f ( n )essere il conteggio di tale multiset possibile quindi dove sto sommando tutto il numero possibile di1′s(=d-1). In altri terminif(n-1)=g(n)=∑d| n,d≠ng(d)
Alla fine il mio problema si riduce a questo: trova in modo efficiente in modo che non superi il limite di tempo.