Pagini recente » Atasamentele paginii Labirint | Cod sursa (job #243875) | Cod sursa (job #3345836) | Diferente pentru problema/ackermann intre reviziile 5 si 13 | Cod sursa (job #3338306)
#include <stdio.h>
#include <string.h>
static int mod_str(const char *s, int mod) {
int r = 0;
for (int i = 0; s[i]; ++i) {
r = (r * 10 + (s[i] - '0')) % mod;
}
return r;
}
static int powmod(int a, int e, int mod) {
int r = 1 % mod;
a %= mod;
while (e > 0) {
if (e & 1) r = (r * a) % mod;
a = (a * a) % mod;
e >>= 1;
}
return r;
}
int main(void) {
FILE *fin = fopen("cifra.in", "r");
FILE *fout = fopen("cifra.out", "w");
if (!fin || !fout) return 0;
int T;
if (fscanf(fin, "%d", &T) != 1) {
return 0;
}
int pref[21];
pref[0] = 0;
for (int k = 1; k <= 20; ++k) {
int last = powmod(k % 10, k, 10);
pref[k] = (pref[k - 1] + last) % 10;
}
int sum20 = pref[20];
for (int tc = 0; tc < T; ++tc) {
char N[10005];
if (fscanf(fin, "%10000s", N) != 1) break;
int r = mod_str(N, 20);
int s = mod_str(N, 200);
int qmod10 = s / 20; /* since s in [0,199] */
int ans = (sum20 * qmod10 + pref[r]) % 10;
fprintf(fout, "%d\n", ans);
}
fclose(fin);
fclose(fout);
return 0;
}