21 / 237
Oct 2015

@bunker96
modulo10 (1000000000002 ** 2) = ?
modulo10 (100000000002 ** 2) = ?
modulo10 (10000000002 ** 2) = ?
modulo10 (1000000002 ** 2) = ?
itd
Czy potrzebujesz całej "a" czy wystarczy jej mały kawałek a może jeszcze mniej a, może wystarczy tylko ociupinka a? wink

Tylko mi zwraca zle wartosci np tam gdzie powinno byc 4 wychodzi 1.
Edit: Dobra zadanie zrobione ale nadal nie rozumiem dlaczego jak dzialalem na duzej podstawie potegi to wyniki zle podawalo. A i jeśli macie jakies rady odnosnie porawy wydajnosci to by mnie bardzo ucieszylo smiley

Pytanie ile będzie wynosić ostatnia cyfra (bo tylko jej potrzebujemy) z 10 * cokolwiek, 30 * cokolwiek itd? W zasadzie potęgowanie w tym zadaniu jest opcjonalne, można sobie "gotowce" przygotować.

No tak zrobilem i dziala. Ale dlaczego nie dzialalo jak uzywalem calej liczby? Przekroczylem jakis limit? Edit Dzieki narbej

Tak. Np.:
1000000**4 = 1000000000000000000000000L < 2**64 = 18446744073709551616L
10000000000000000000**4 = 10000000000000000000000000000000000000000000000000000000000000000000000000000

max unsigned long long = 2**64 -1 = 18446744073709551615
max unsigned int = 2 ** 32 -1 = 4294967295

2 months later

Mógł by ktos pomoc? Na testach ten kod działa poprawnie ale "sąd" widzi gdzieś nadal błąd

 <code>

#include<iostream>
#include<math.h>

using namespace std;
int n,*b,*p,*w;

int potega(int p,int w)
{
    if(w==1) return 1;
    else
       return p*potega(p,w-1);
}

int main()
{
    cin>>n;
    if ((n<=1)||(n>=10))return 0;
    b=new int[n];
    p=new int[n];
    w=new int[n];
    for(int i=0;i<n;i++)
    {
        cin>>p[i]>>w[i];
        w[i]++;
    }
        for(int i=0;i<n;i++)
    {
        if(potega(p[i],w[i])>9)
        {
            cout<<(((int)potega(p[i],w[i])))-(((int)potega(p[i],w[i])/10)*10)<<endl;
        }
        else cout<<potega(p[i],w[i])<<endl;
    }




    return 0;
}
</code>

Jesli sie ktos to zrozumie to gratuluje xD "Czytanie kodu jest jak wąchanie bąków - nie jest tak źle jak jest własny."

Przeczytaj wszystkie albo chociaż część komentarzy w tym wątku, jak zrozumiesz to gwarantuję, na pewno będziesz miał AC. Natomiast twój kod, bez czytania widać, że twój kod jest do ... bani, ale sam zobacz:
http://ideone.com/Wgw3Kz253
Testy z zadania, to zupełne minimum z minimum, służą bardziej do "mentalnego" zrozumienia zadania a nie do całkowitego stwierdzenia poprawności kodu. Powinieneś wymyślać swoje własne, trudniejsze testy, a tu możesz sprawdzać ich poprawność [dla dowolnych danych]:

http://www.wolframalpha.com/input/?i=mod+%2810000000000000003^2%2C+10%29154

Zastanawiam się co tu może być jeszcze źle, na moich testach już praktycznie wszystko działa confused

   <juz znalazlem blad>

Wiesz, że istnieje takie coś jak wyszukiwanie?( Dokładniej taka lupa w prawym górnym rogu). Ten temat był przetwarzany wiele razy.
Znalazłem test, dla którego twój program daje niepoprawny wynik:
1
333 32323213
Twój out: 1
Poprawny out: 3
Poza tym twój kod jest strasznie nieczytelny - zbyt dużo warunków. Popraw ten kod z pomocą tego linka: cyfra jedności potęgi267.
Wystarczy ułożyć poprawny algorytm z podanych informacji.

PS. Na przyszłość nie twórz nowych wątków, tylko dołączaj się do już istniejących.
PS 2. Zobacz ile już było wątków: wątki

1 month later

Czyli, aby wyznaczyć resztę z potęgowania muszę wyznaczyć dla każdej cyfry warunek, tak ?

Jeżeli dobrze rozumiem "wyznaczyć resztę", to tak.

Ale czy moje rozumienie ma tu jakieś znaczenie? Chyba lepiej po prostu napisać program realizujący Twoją myśl i zobaczyć co z niego wyjdzie wink

14 days later

Panowie... poległem, po przeczytaniu tych wszystkich postów i dosłownie dziesiątek prób zmian tego kodu doszedłem do tej wersji i mimo, że przy każdej sprawdzanej przeze mnie kombinacji cyfr wynik wychodzi dobry, to jednak SPOJ nie akceptuje mojego kodu.

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int a, t;
    double b, c;
    
    cin >> t;
    
    for(int i = 0 ; i < t ; i++)
    {
            cin.clear();
            cin.sync();
            
            cin >> a >> b;
            
            a = a%10;
            c = pow(a, b);
            int d  = (int)(c);
            
            cout << d%10 << endl;
    }
    return 0;
}

Widać druga cyfra nie byłą wystarczająco duża, dla testu 2 100 twój program wypisuje -8 a poprawna odpowiedź to 6. A w tym zadaniu mogą pojawić się dużo większe b niż 100.

edit: umieszczaj kod w tagach dostępnych pod ctrl + k albo linkuj do ideone, inaczej będzie "pocięty".

Dzięki za uświadomienie błędu, zaliczyło zadanie po poprawie!

Też mam problem z tym zadaniem mianowicie na ideone.com kiedy sprawdzam program wyskakuje sukces. Ale sędzia wyrzuca mi błąd ze przekroczyłem limit czasu

Wklej swój kod, inaczej nikt nie będzie w stanie Ci pomóc.

Jeżeli jednak nie chcesz wklejać kodu to mam pewną sugestię: problem może leżeć w sposobie wczytywania danych.

Jeżeli na przykład dane wczytujesz w for(int i = 0; i <= t; i++) to pętla wykona się t+1 razy (0, 1, 2, ... , t). Przykładowo:

2
2 3
3 3

2 i 3 - bez problemu, 3 i 3 - bez problemu.

Ale co dalej? Program będzie czekał na jeszcze jeden zestaw danych. Na ideone daje to sukces a na SPOJu WA (sprawdzone na moim kodzie do tego zadania).

Ale lukaster o TLE pisał. Poza tym takich przypadków są setki.