Pagini recente » Cod sursa (job #2600053) | Cod sursa (job #1187664) | Cod sursa (job #2648677) | Cod sursa (job #1570457) | Cod sursa (job #3041667)
#include <fstream>
#include <string>
using namespace std;
/// Nu am gasit o demonstratie matematica de ce suma cicleaza dupa primii 100 termeni.
/// Intuitiv, ideea ar fi ca pozitia 100 este prima unde ultima cifra a sumei redevine 0 (cum era pentru N = 0), dar unde si urmatorul termen, (N + 1)^(N + 1), are ultima cifra 1,
/// adica se reindeplinesc suficiente conditii ca suma sa treaca prin aceleasi ultime cifre inca o data, asa cum a facut pentru N = 1, 2, ..., etc..
string s;
const int PRECALC = 100;
int ultimaCifra[1 + PRECALC];
void preCalc()
{
for (int i = 1; i <= PRECALC; i++)
{
int sol = 1;
int j = i;
while (j--)
{
sol *= i;
sol %= 10;
}
ultimaCifra[i] = (ultimaCifra[i - 1] + sol) % 10;
}
}
int main()
{
ifstream in("cifra.in");
ofstream out("cifra.out");
ios_base::sync_with_stdio(false);
in.tie(nullptr);
preCalc();
int t;
in >> t;
while (t--)
{
in >> s;
if (s.size() == 1)
{
out << ultimaCifra[s[0] - '0'] << '\n';
}
else
{
out << ultimaCifra[10 * (s[s.size() - 2] - '0') + (s[s.size() - 1] - '0')] << '\n';
}
}
/*
for (int i = 0; i <= PRECALC; i++)
{
out << ultimaCifra[i] << ' ';
if (i % 100 == 0)
out << '\n';
if (ultimaCifra[i] == 0)
out << '\n' << "Poz " << i << '\n';
}
out << '\n';
*/
in.close();
out.close();
return 0;
}