Twój program działa za wolno, limit działania programu na tym zadaniu na spoju to 1s. Np dla n = 10^7 twój program działa dużo dłużej niż 1s.
auto foo (int liczba) -> long long int
{
if(liczba <= 1 ) return 1;
else
{
return liczba*foo(liczba-1);
}
}
Implementacja silni rekurencyjnie to jest zły pomysł bo dla n = 10^9 na stosie wyląduje co najmniej 3.72GIB pamięci zakładając ze adres powrotu funkcji zajmuje 4 bajty (pomijając już kwestie przekazywania argumentów, ramkę stosu i wyrównanie pamięci). Stos ma dużo mniejszy limit niż 3GB więc program wyrzuca SIGSEGV.
Liczenie całej liczby reprezentującej silnie to też jest zły pomysł ponieważ dla n >= 13 n! przekracza 2^31 czyli górny limit inta jaki może trzymać na większości architektur co daje niezdefiniowane zachowanie według specyfikacji języka c oraz c++.
Przed wysłaniem rozwiązań polecam je sprawdzać lokalnie wliczając w to skrajnie duże dane.
show = std::to_string(foo(n));
Nie widzę powodu aby konwertować liczby do ciągu znaków a później przeglądać tego ciągu znaków liniowo w poszukiwaniu ostatnich dwóch cyfr. foo(n) % 10 zwraca ostatnią cyfrę a foo(n) / 10 % 10 przedostatnią cyfrę.
if(1<=d && d <= 30) {
// ...
if( 0<=n && n <= 1000000000 ) {
// ...
}
}
Sprawdzanie poprawności danych na spoju i tego typu platformach jest w ogólności zbędne, możesz założyć że wprowadzone dane będą spełniały specyfikację z treści zadania.
int d, n;
std::string show;
W ogólności zmienne globalne są złe, ale powiedzmy że w rozwiązaniach zadań algorytmicznych są akceptowalne.
Co do podejścia algorytmu liczącego ostatnie dwie cyfry silni polecam zobaczyć sobie jak wygląda silnia dla n >= 10, to powinno pomóc w wymyśleniu znacznie wydajniejszego algorytmu.