Biorąc pod uwagę liczbę całkowitą N , policz, ile sposobów można wyrazić jako iloczyn liczb całkowitych M > 1.
Dane wejściowe to po prostu N i M , a dane wyjściowe to całkowita liczba różnych grup całkowitych. Oznacza to, że możesz użyć liczby całkowitej więcej niż jeden raz, ale każda grupa musi być odrębna ( 3 x 2 x 2
nie liczyłaby się, jeśli 2 x 2 x 3
jest obecna).
Ograniczenia
1 < N <2 31
1 < M <30
Przykłady
Dane wejściowe 30 2
dają dane wyjściowe 3
, ponieważ można je wyrazić na 3 sposoby:
2 x 15
3 x 10
5 x 6
Wejście 16 3
daje wynik 1
, ponieważ istnieje tylko jedna odrębna grupa:
2 x 2 x 4
Dane wejściowe 2310 4
dają dane wyjściowe 10
:
5 x 6 x 7 x 11
3 x 7 x 10 x 11
3 x 5 x 11 x 14
3 x 5 x 7 x 22
2 x 7 x 11 x 15
2 x 5 x 11 x 21
2 x 5 x 7 x 33
2 x 3 x 11 x 35
2 x 3 x 7 x 55
2 x 3 x 5 x 77
Dane wejściowe 15 4
dają dane wyjściowe 0
, ponieważ nie można tego zrobić.
Zasady
Obowiązują standardowe luki w kodzie golfowym wraz ze standardowymi definicjami wejścia / wyjścia. Odpowiedzi mogą być funkcją lub pełnym programem. Wbudowane funkcje faktoryzacji i / lub partycjonowania są niedozwolone, ale inne są w porządku. Kod jest liczony w bajtach.
Odpowiedzi:
Pyth -
24232221 bajtówNie jest to skomplikowane rozwiązanie. Będzie więcej grał w golfa. Po prostu bierze kartezjański produkt list i filtrów. Taka sama strategia jak @optimizer (zgaduję z powodu jego komentarza, tak naprawdę nie odszyfrował tego CJam) Dzięki @FryAmTheEggman za 2 bajty i oszukać za pomocą M.
Definiuje funkcję
g
z argumentamiG
iH
Pracowałem nad wszystkimi argumentami testowymi oprócz ostatniego, był zbyt wolny na tym, ale nie podano limitu czasu.
źródło
M
który określa funkcjęg
2 argumentów,G
iH
. To, co mam do tego:Ml{msdfqu*GHT1G^r2GH
. Zawsze miło jest widzieć innego użytkownika Pyth :)72 3
, które zwracają 5, ale tak naprawdę jest 6 odpowiedzi,(2, 2, 18), (2, 3, 12), (2, 4, 9), (2, 6, 6), (3, 3, 8)
Python 3, 59
Liczymy potencjalnych dzielników
i
. Z dodatkowym argumentemi
jako najniższym dozwolonym dzielnikiem podstawowa relacja rekurencyjna toDla każdego z nich
i
albo wybieramy to (możliwe powtórzenie), w którym to przypadku dzielimy wymagany produktN
przezi
i zmniejszamyM
. Jeśli nie, zwiększamyi
o 1, ale tylko wtedyi<N
, gdy nie ma sensu sprawdzać dzielników większych niżN
.Kiedy minimalny dzielnik
i
przekroczyN
, nie ma już potencjalnych dzielników. Sprawdzamy więc, czy nam się udało, sprawdzając, czyM==0 and N==1
, lub równoważnie,M+1==N==1
lubM+1==N<2
, od kiedyM+1==N
, wzajemna wartość jest gwarantowana jako dodatnia liczba całkowita (dzięki FryAmTheEggman za tę optymalizację).Ten kod spowoduje przepełnienie stosu dla
N
około 1000 w większości systemów, ale można go uruchomić w Pythonie bez stosu, aby tego uniknąć. Co więcej, jest niezwykle wolny ze względu na wykładnicze rekurencyjne rozgałęzianie.źródło
-~M==N<2
M
iN
. Dzięki!Ruby, 67
Właściwie dość wydajny jak na definicję rekurencyjną. Dla każdej pary dzielników
[d,q]
n, przyd
czym będąc mniejszą, sumujemy wynikf[q,m-1]
. Problem polega na tym, że w wewnętrznych wywołaniach ograniczamy czynniki do tych, które są większe lub równe d, aby nie skończyć podwójnym liczeniem.źródło
CJam, 48 bajtów
To może być o wiele krótsze, ale dodałem pewne kontrole, aby działały na przyzwoitą liczbę w
M
kompilatorze online.Wypróbuj online tutaj
źródło
2 1
. Oczekiwany wynik: 1. Rzeczywisty wynik: 0.T-SQL
456373Jestem pewien, że to się zepsuje, gdy dane wejściowe będą nawet bliskie bycia dużymi.
Dzięki @MickyT za pomoc w uratowaniu wielu znaków dzięki CONCAT i SELECTing zamiast wielu zestawów.
źródło
SET @C+=',# A'+@
iSET @D+='*A'+@+'.A'SET @E+=' AND A'+(@-1)+'.A<=A'+@+'.A'
SET @C+=@D+'=@N'+@E+' SELECT @'
.@N
Jest wewnątrz cudzysłowów czyni go poza zakresem podczas wykonywania@C
. Myślę też, że skończysz na liczeniu duplikatówCONCAT
do zbudowania swoich ciągów. Następnie możesz upuścićCONVERT
s. SpróbujSELECT @+=1,@C+=CONCAT(...),@D+=CONCAT(...),@E+=CONCAT(...)
w swojejWHILE
pętli. Powinieneś zaoszczędzić rozsądną liczbę