SPOJ, wynik w postaci cyfry jednosci (potegowanie) - problem z zadaniem

0

Witam, mam problem z pozornie łatwym zadaniem. Jako że moje rozwiązanie było niepoprawne to postanowiłem czegoś poszukać i natknąłem się na taki sposób :
Nie wiem czy jest dobry, ale na pewno istnieje jeszcze lepszy natomiast moje pytanie odnosi się do tego po co używamy reszty z dzielenia wykładnika przez 4? (10:28)
Link do zadania: https://pl.spoj.com/problems/PA05_POT/

1

W przypadku dowolnej cyfry a wynik (a ^ 5) % 10 zwróci taką samą wartość, jak a % 10. Z resztę, chwilę wcześniej było opisane, jak zmieniają się cyfry dziesiętne a ^ b w zależności od cyfry dziesiętnej a. Można liczyć rozwiązanie dla każdej cyfry oddzielnie, a można wziąć NWW wszystkich długości okresu i dzielić b przez to NWW. Jak pokazano na filmie, to NWW wynosi 4.
Teraz rozpisujemy dane b jako 4 * d + r, więc a ^ b == a ^ (4 *d) * a ^ r, biorąc z tego ostatnie cyfry (dzielenie modulo 10), mamy równość (a ^ (4 * d) * a ^ r) % 10 == (a ^ r) % 10, gdzie r = b % 4. Matematycznie nie zgadza się kwestia, gdy r wynosi 0, bo a ^ 0 == 1, więc w powyższym rozwiązaniu jest obejście z tym, że elementem pod zerowym indeksem jest wynik działania (a ^ 4) % 10, a w danych wejściowych nigdy nie pojawia się 0 jako wykładnik. Ciężko opisać to jaśniej niż jest na tym filmie, gdzie wszystkie potrzebne informacje są podane.

0
micw napisał(a):

.... ale na pewno istnieje jeszcze lepszy natomiast

Tak:

#include <stdio.h>

int main() 
  {
   unsigned T,a,b;
   for(scanf("%u",&T);(T--)&&(scanf("%u%u",&a,&b));) printf("%c\n",(10*(b&3)+(a%10))["0161656161012345678901496569410187456329;)"]);
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1