Cod sursa(job #1289751)

Utilizator ghimpeleSeteanu Radu ghimpele Data 10 decembrie 2014 11:35:40
Problema Cifra Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <stdio.h>
#include <string.h>
#define LMax 110

const char IN[] = "cifra.in", OUT[] = "cifra.out";

int Tes, sum = 0;
int v[25];
int num[LMax];

int pow( int x, int p ) {

	int sol = 1;

	x %= 10;
	for ( int i = 0; ( 1 << i ) <= p; ++ i ) {
		if ( (1 << i) & p )
			sol = sol * x % 10;
		x = x * x % 10;
	}
	return sol;

}

int imp( int * a, int b ) {

	int r = 0;
	for ( int i = a[0]; i > 0; -- i ) {
		r = (a[i] = r * 10 + a[i]) % b;
		a[i] /= b;
	}
	while ( a[0] > 1 && a[a[0]] == 0 )
		-- a[0];
	return r;
}

void inm( int * a, int b ) {

	int t = 0;
	for ( int i = 1; i <= a[0]; ++ i ) {
		t = ( a[i] = a[i] * b + t ) / 10;
		a[i] %= 10;
	}
	while (t) {
		a[++a[0]] = t % 10;
		t /= 10;
	}
}

void add( int * a, int b ) {
	int t = 0;
	a[1] += b;

	for ( int i = 1; i <= a[0]; ++ i ) {
		t = ( a[i] = a[i] + t ) / 10;
		a[i] %= 10;
	}
	if ( t )
		a[ ++a[0] ] = t;
}

void read( int * a ) {
	static char s[LMax];
	scanf("%s", s + 1);

	a[0] = strlen(s + 1);

	for ( int i = 1; i <= a[0]; ++ i )
		a[i] = s[a[0] - i + 1] - '0';
}

void write( int * a ) {

	for ( int i = a[0]; i > 0; -- i )
		printf("%d", a[i]);
	printf("\n");
}

int main() {

	freopen(IN, "r", stdin);
	freopen(OUT, "w", stdout);

	for ( int i = 1; i <= 20; ++ i )
		v[i] = pow(i, i);

	for ( int i = 1; i <= 20; ++ i )
		sum += v[i];

	scanf("%d", &Tes);
	while ( Tes -- ) {
		int r, s = 0;
		memset(num, 0, num[0] * sizeof(int));
		read(num);
		r = imp(num, 20);
		inm(num, sum);

		for ( int i = 1; i <= r; ++ i ) s += v[i];

		printf("%d\n", (num[1] + s) % 10);
	}
	return 0;
}