Cod sursa(job #307089)

Utilizator pcinfoCarmen Popescu pcinfo Data 22 aprilie 2009 22:35:50
Problema Cifra Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>

using namespace std;

ifstream f("cifra.in");
ofstream g("cifra.out");

int c[10][4]={{0,0,0,0},{1,1,1,1},{6,2,4,8},{1,3,9,7},{6,4,6,4},{5,5,5,5},{6,6,6,6},{1,7,9,3},{6,8,4,2},{1,9,1,9}};

// c[i][j] = ultima cifra a lui i la puterea 4*k+j
// (abc^abc)%10 = (abc^bc)%10 = (bc^bc)%10
// adica ultima cifra a expresiei x^x depinde doar de ultimele 2 cifre ale lui x
// Se poate deduce ca 
//    ultima cifra(1^1+2^2+...+100^100) = 0
// eventual scriind un program care calculeaza aceasta cifra
// iar pentru x>100 obtinem
//   sum(x) = ultima cifra(1^1+2^2+...+100^100+101^101+...+x^x) =     
//          = ultima cifra(1^1+2^2+...+100^100) + ultima cifra(101^101) + ultima cifra(102^102) + ... +ultima cifra(x^x) =
//          = 0 + ultima cifra(1^1)+ultima cifra(2^2) + ...
//          = sum(x%100), 
// adica doar ultimele 2 cifre ale lui x conteaza 
// asadar calculam sum(x) pentru x pana la 100 si retinem valorile intr-un vector

int main()
{
	int s[101],i,n,k,m;
	char nr[105];
	
	s[0]=0; s[1]=1;
	for (i=2;i<=99;i++)
		s[i]=(s[i-1]+c[i%10][i%4])%10;
	
	f>>n;
	for (i=1;i<=n;i++)
	{
		f>>nr;
		m=strlen(nr);
		k=nr[m-1]-'0';
		if (m>1)
			k=k+(nr[m-2]-'0')*10;
		
		g<<s[k%100]<<"\n";
	}
	f.close();
	g.close();
	return 0;
}