Forum jest zablokowane. Podczas blokady nie można dodawać ani edytować wiadomości.
Ostatnie posty
A ja się zastanawiam, jak kompilujesz program. Pokaż linię poleceń.
Spróbuj tak:
g++ twojplik.cpp zeus.c message.c
Spróbuj tak:
g++ twojplik.cpp zeus.c message.c
Miałem podobny błąd. Pomogła rekompilacja parunnera, tak jak napisano w README:
cd src/parunner
go build
cp parunner ../../executable/
cd src/parunner
go build
cp parunner ../../executable/
Czy miał ktoś może problem odpalania rozwiązań zadań rozproszonych na systemie mac os? Wyskakuje mi błąd:
failed MSpanList_Insert 0x225000 0x1301fae4d0206 0x0
fatal error: MSpanList_Insert
runtime stack:
runtime.throw(0x1d618b)
(...) //reszta błędów
Doceniam każdą pomoc.
failed MSpanList_Insert 0x225000 0x1301fae4d0206 0x0
fatal error: MSpanList_Insert
runtime stack:
runtime.throw(0x1d618b)
(...) //reszta błędów
Doceniam każdą pomoc.
Male sprostowanie co do "dobrych" będzie O(log(n))".
Rozumiem, ze dobre to dzielniki n. Wiec podane stwierdzenie nie jest prawdziwe.
Choc na potrzeby zadania wystarczy przyjac ze dobrych jest dostatecznie malo.
Srednio owszem wychodzi: (d(1) + d(2) + ... + d(n) = O(n log n)) ale d(n) nie jest O(log(n))
Bodaj d(n) = n^O(1/(log log n)) to najlepsze znane oszacowanie.
Rozumiem, ze dobre to dzielniki n. Wiec podane stwierdzenie nie jest prawdziwe.
Choc na potrzeby zadania wystarczy przyjac ze dobrych jest dostatecznie malo.
Srednio owszem wychodzi: (d(1) + d(2) + ... + d(n) = O(n log n)) ale d(n) nie jest O(log(n))
Bodaj d(n) = n^O(1/(log log n)) to najlepsze znane oszacowanie.
Można wyliczyć liczbę dzielników w czasie O(n^1/3).
Tablicujemy liczby pierwsze < 1000 i wyliczamy ilość dzielników gdzie pi < 1000. Pozostają dzielniki pierwsze > 1000. Będzie ich najwyżej 2, bowiem dla trzech ich iloczyn przekroczyłby liczbę 10^9. Zatem domnażamy ilość dzielników przez 2, 3 lub 4. Można znaleźć ten algorytm na stronie codeforces.com.
Żeby sprawdzić efektywnie czy liczba jest pierwsza można zastosować silny test(SPRP) pierwszości Millera-Rabina. Jednak wymaga on 4 rund, trzeba przeprowadzić taki test dla 4 tzw. świadków złożoności. Wybieramy 4 najmniejsze liczby pierwsze 2, 3, 5, 7.
Niedawno ukazała się praca Fast Primality Testing for Integers That Fit into a Machine Word autorów Michal Forisek (misof) i Jakub Jancina,
w której to pracy przeprowadza się dokładnie raz silny test pierwszości Millera-Rabina i korzysta się z pewnej funkcji haszującej.
Dla liczb 64-bitowych wystarczy wykonać 2 lub 3 testy.
W artykule jest też odnośnik do implementacji. Można nieco przyspieszyć sam test Millera-Rabina tam zaimplementowany, bowiem w książce Algorytmika Praktyczna, Nie tylko dla mistrzow, autor: Piotr Stańczyk, test pierwszości wykonuje nieco mniej operacji mnożenia, choć wymaga wykonania 4 rund testu.
Można zatem efektywnie szukać rozwiązań również dla większych n, np. 10^18.
Tablicujemy liczby pierwsze < 1000 i wyliczamy ilość dzielników gdzie pi < 1000. Pozostają dzielniki pierwsze > 1000. Będzie ich najwyżej 2, bowiem dla trzech ich iloczyn przekroczyłby liczbę 10^9. Zatem domnażamy ilość dzielników przez 2, 3 lub 4. Można znaleźć ten algorytm na stronie codeforces.com.
Żeby sprawdzić efektywnie czy liczba jest pierwsza można zastosować silny test(SPRP) pierwszości Millera-Rabina. Jednak wymaga on 4 rund, trzeba przeprowadzić taki test dla 4 tzw. świadków złożoności. Wybieramy 4 najmniejsze liczby pierwsze 2, 3, 5, 7.
Niedawno ukazała się praca Fast Primality Testing for Integers That Fit into a Machine Word autorów Michal Forisek (misof) i Jakub Jancina,
w której to pracy przeprowadza się dokładnie raz silny test pierwszości Millera-Rabina i korzysta się z pewnej funkcji haszującej.
Dla liczb 64-bitowych wystarczy wykonać 2 lub 3 testy.
W artykule jest też odnośnik do implementacji. Można nieco przyspieszyć sam test Millera-Rabina tam zaimplementowany, bowiem w książce Algorytmika Praktyczna, Nie tylko dla mistrzow, autor: Piotr Stańczyk, test pierwszości wykonuje nieco mniej operacji mnożenia, choć wymaga wykonania 4 rund testu.
Można zatem efektywnie szukać rozwiązań również dla większych n, np. 10^18.
1) Te trzy warunki z treści sprowadzają się do b=ka, c=mb, gdzie k,m>1
2) Wtedy n=a+b+c = a*[1+k*(1+m)] => a|n oraz n/a-1 = k*(1+m)
3) Sprawdzamy każde możliwe a [trzeba sprawdzić ich O(sqrt(n)), "dobrych" będzie O(log(n))] i chcemy wiedzieć na ile sposobów liczbę n/a-1 (nazwijmy ją N) można przedstawić jako x*y gdzie x>=2, y>=3.
4) Dla każdego dzielnika d|N, rozkład x=d, y=N/d jest poprawny, z wyjątkiem: x=1, y=1, y=2. Czyli jeśli N jest parzyste to możliwych rozkładów jest liczba_dzielników(N)-3, jeśli N jest nieparzyste to jest ich liczba_dzielników(N)-2.
5) Jak obliczyć liczbę dzielników? Niech N=p1^a1 * p2^a2 * ... *pk^ak [rozkład na czynniki pierwsze, do obliczenia w O(sqrt(N))]. Każdy dzielnik d|N ma postać d=p1^b1 * p2^b2 * ... * pk^bk, gdzie 0<=bi<=ai. Wybór każdego bi jest niezależny, więc możliwych wyborów ciągów b jest liczba_dzielnikow(N)=(a1+1)*(a2+1)*...(ak+1).
2) Wtedy n=a+b+c = a*[1+k*(1+m)] => a|n oraz n/a-1 = k*(1+m)
3) Sprawdzamy każde możliwe a [trzeba sprawdzić ich O(sqrt(n)), "dobrych" będzie O(log(n))] i chcemy wiedzieć na ile sposobów liczbę n/a-1 (nazwijmy ją N) można przedstawić jako x*y gdzie x>=2, y>=3.
4) Dla każdego dzielnika d|N, rozkład x=d, y=N/d jest poprawny, z wyjątkiem: x=1, y=1, y=2. Czyli jeśli N jest parzyste to możliwych rozkładów jest liczba_dzielników(N)-3, jeśli N jest nieparzyste to jest ich liczba_dzielników(N)-2.
5) Jak obliczyć liczbę dzielników? Niech N=p1^a1 * p2^a2 * ... *pk^ak [rozkład na czynniki pierwsze, do obliczenia w O(sqrt(N))]. Każdy dzielnik d|N ma postać d=p1^b1 * p2^b2 * ... * pk^bk, gdzie 0<=bi<=ai. Wybór każdego bi jest niezależny, więc możliwych wyborów ciągów b jest liczba_dzielnikow(N)=(a1+1)*(a2+1)*...(ak+1).
Takie napisane na pałe to takie mam:
#include <iostream>
using namespace std;
#define ll long long
int main()
{
ll n, wynik=0;
cin>>n;
for(ll ii=1;ii*ii<=n;ii++){
if(n%ii) continue;
ll i=ii;
ll tmp = (n-i)/i;
for(ll j=2;j*j<=tmp;j++){
if(tmp%j==0)
wynik++;
if(tmp%(tmp/j)==0 && tmp-(tmp/j)!=tmp/j)
wynik++;
if(j*j==tmp)
wynik--;
}
if(ii==1 || ii*ii==n) continue;
i=n/ii;
tmp = (n-i)/i;
for(ll j=2;j*j<=tmp;j++){
if(tmp%j==0)
wynik++;
if(tmp%(tmp/j)==0 && tmp-(tmp/j)!=tmp/j)
wynik++;
if(j*j==tmp)
wynik--;
}
}
cout<<wynik;
}
ale jestem pewien że można to zrobić w kilka linijek.
Brzydkie ale zalicza wszystkie testy.
#include <iostream>
using namespace std;
#define ll long long
int main()
{
ll n, wynik=0;
cin>>n;
for(ll ii=1;ii*ii<=n;ii++){
if(n%ii) continue;
ll i=ii;
ll tmp = (n-i)/i;
for(ll j=2;j*j<=tmp;j++){
if(tmp%j==0)
wynik++;
if(tmp%(tmp/j)==0 && tmp-(tmp/j)!=tmp/j)
wynik++;
if(j*j==tmp)
wynik--;
}
if(ii==1 || ii*ii==n) continue;
i=n/ii;
tmp = (n-i)/i;
for(ll j=2;j*j<=tmp;j++){
if(tmp%j==0)
wynik++;
if(tmp%(tmp/j)==0 && tmp-(tmp/j)!=tmp/j)
wynik++;
if(j*j==tmp)
wynik--;
}
}
cout<<wynik;
}
ale jestem pewien że można to zrobić w kilka linijek.
Brzydkie ale zalicza wszystkie testy.
Czy ktoś mógłby podzielić się swoim rozwiązaniem?
ale jazda za 20 sekund koniec
Potwierdzam testy Kajetana.
Potwierdzam testy.
1 2 999564
1 17 999549
1 34 999532
1 29399 970167
1 58798 940768
3 6 999558
3 12 999552
3 93 999471
3 186 999378
3 372 999192
3 8061 991503
3 16122 983442
3 32244 967320
3 249891 749673
9 18 999540
9 63 999495
9 126 999432
9 71397 928161
9 142794 856764
27 54 999486
27 81 999459
27 108 999432
27 135 999405
27 162 999378
27 270 999270
27 324 999216
27 405 999135
27 540 999000
27 810 998730
27 1620 997920
27 16659 982881
27 33318 966222
27 49977 949563
27 66636 932904
27 83295 916245
27 99954 899586
27 166590 832950
27 199908 799632
27 249885 749655
27 333180 666360
37021 74042 888504
111063 222126 666378
1 17 999549
1 34 999532
1 29399 970167
1 58798 940768
3 6 999558
3 12 999552
3 93 999471
3 186 999378
3 372 999192
3 8061 991503
3 16122 983442
3 32244 967320
3 249891 749673
9 18 999540
9 63 999495
9 126 999432
9 71397 928161
9 142794 856764
27 54 999486
27 81 999459
27 108 999432
27 135 999405
27 162 999378
27 270 999270
27 324 999216
27 405 999135
27 540 999000
27 810 998730
27 1620 997920
27 16659 982881
27 33318 966222
27 49977 949563
27 66636 932904
27 83295 916245
27 99954 899586
27 166590 832950
27 199908 799632
27 249885 749655
27 333180 666360
37021 74042 888504
111063 222126 666378
moge prosic i zrzut wszystkich 3jek np dla 999567? jakis przypadkow moj algorytm nie uwzglednia, ale nie moge dojsc jakich
123567976 -> 460
8881888 -> 264
1008485 -> 129
21376942 -> 53
8881888 -> 264
1008485 -> 129
21376942 -> 53
Potwierdzam wszystkie dotychczasowe testy.