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;10
9>, 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 a
i∊<0,10
9> ? Skoro jest to zadania na konkurs to na pewno nikt Ci
nie pomoże

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 a
i w postaci 2
b1*3
b2*5
b3*.......
w jaki sposób? już podaję:
for {k=1,k<='ileś', k++,
| | ai | |
m=floor( |
| ) // ck jest to k−ta liczba pierwsza |
| | ck | |
liczbaliczb
k = 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 a
i
//tu chyba sobie poradzisz //
czyli mamy zapisaną liczbę a
1!*....*a
n!
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 2
x*5
x 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