matematykaszkolna.pl
mocne zadanie Rodney: ZADANIE DLA NAJTWARDSZYCH A więc tak, robię zadanie na konkurs informatyczny i szukam jakiegoś sposobu na rozwiązanie... muszę napisać program, który poda ostatnią niezerową cyfrę takiej liczby: (a1+a2+ … +an)!/(a1!*a2!* … *an!) gdzie n≤20 Na koniec jest wskazówka: "Note that this is an extension of the classical problem, since factorials (and binomial numbers) are also multinomial numbers!" No i pytanie... jak to zrobić? a∊<0;109>, wiec wyliczanie calej wartosci i potem szukanie ostatniej cyfry odpada, bo po prostu program nie policzy tak duzych wartosci... Jest ktos w stanie pomoc? Na poziomie liceum...
16 paź 20:30
Jack: dla każdego i jest tak, że ai∊<0,109> ? Skoro jest to zadania na konkurs to na pewno nikt Ci nie pomoże emotka Choć zadanie jest ciekawe...
16 paź 22:43
Rodney: hmm... licze po prostu na to, ze moze ktos rzuci jakims pomyslem, bo ciezko mi zauwazyc jakas prawidlowosc tak, dla kazdego i jest taki przedzial co sprawia, ze zadanie staje sie nie do policzenia, trzeba znalezc jakis cwany sposob
16 paź 22:52
b.: http://hs.spoj.pl/problems/HS12MULT/ ,,Termin nadsyłania rozwiązań I serii zadań został przesunięty o tydzień do poniedziałku dwudziestego drugiego października 2012'' nie jestem pewien, czy to zadanie jest z pierwszej serii, ale domyślam się, że tak > You may perhaps know how to find the last nonzero digit of n factorial. Wiesz?
16 paź 23:35
Rodney: wlasnie... tego tez nie wiem... duzo kombinowalem, rozne opcje, ale wszystko dzialalo do pewnej granicy, nie moglem znalezc sposobu uniwersalnego...
17 paź 19:17
Artur_z_miasta_Neptuna: ja mam pewną propozycję: 1) zapisujemy każdą z liczb ai w postaci 2b1*3b2*5b3*....... w jaki sposób? już podaję: for {k=1,k<='ileś', k++,
 ai 
m=floor(

) // ck jest to k−ta liczba pierwsza
 ck 
liczbaliczbk = 0 for {j=1, j<=m, j++
 ai 
liczbaliczbi,k += floor(

) // chyba tak się zapisywało sumowanie w kolejnych
 (ck)j 
krokach } } 2) sumujemy potęgi tej samej liczby pierwszej z rozkładów różnych ai //tu chyba sobie poradzisz // czyli mamy zapisaną liczbę a1!*....*an! 3) robimy różnicę potęg tej samej liczby pierwsze z rozkładów licznika i mianownika // tu też chyba sobie poradzisz // czyli mamy zapisany ułamek w postaci z pkt (1) 4) 'odrzucamy' odpowiednią liczbę '2' i '5' z tego rozkładu (bo tylko iloczyn 2x*5x daje 'x' zer) x = min(α , β) // gdzie α to potęga '2', natomiast β to potęga '5' 5) każdą liczbę pierwszą w rozkładzie 'redukujemy' do jej ostatniej cyfry (cyfry jedności) 6) dokonujemy potęgowania każdej z nich przez odpowiednią potęgę (i od razu redukujemy do cyfry jedności) 7) mnożymy otrzymane cyfry jedności przez siebie i redukujemy do cyfry jedności 8) wywalamy wynik Plusy rozwiązania: − operacje dokonywane na relatywnie niskich liczbach (żadna liczba w pkt(1) nie przekracza 20*109, później już tylko lecimy na cyfrach jedności) − operacje elementarne (dzielenie ... potęgowanie liczb mniejszych od 10 ... dodawanie i odejmowanie) Minusy rozwiązania: − mimo wszystko znaczna ilość operacji jaką musi wykonać program
 a 
− konieczność wpisania wewnętrznych programów min(a,b) oraz floor(

)
 b 
− konieczność pracy na ogromnej liczbie tablic (konieczny pomysł na jakieś rozwiązanie deklarowania dynamicznego liczby tablic i ich długości) − konieczność stworzenia SPRAWNEGO algorytmu do wyszukiwania liczba pierwszych mniejszych od .... −−−− i to jest najgorsze
18 paź 09:22
b.: ja mam propozycję, żeby dyskusje na temat tego zadania odłożyć na po 22 października − to jest zadanie konkursowe, które powinno się jednak samodzielnie rozwiązywać
18 paź 09:32