Cod sursa(job #155974)

Utilizator vlad_olteanVladimir Oltean vlad_oltean Data 12 martie 2008 11:54:34
Problema Cifra Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<fstream>
using namespace std;
int t,n,uc=0;
int calculat[100]={-1};
int putere[100]={-1};

ifstream fin("cifra.in");

void citeste()
{   char c[100]={0};
    int count=0;

    fin.get(c,100,'\n');
    fin.get();
    count=strlen(c);

    switch (count)
    {   case 1: {n=c[0]-'0';break;}
	case 2: {n=10*(c[0]-'0')+c[1]-'0';break;}
	default: n=10*(c[count-2]-'0')+c[count-1]-'0';
    }
}

void scrie()
{
    printf("%d\n",uc);
}

void rezolva()
{   int i, ir;
    int temp;

    fin>>t;   //Citeste nr de teste
    fin.get();

    while(t--)
    {   citeste();  //Citeste fiecare test
	if(calculat[n]==-1)      //Verifica sa nu calculeze de 2 ori
	{   uc=0;
	    for(i=1;i<=n;i++)    //Fiecare numar i pana la n
	    {    if(putere[i]==-1)  //Nu cumva sa repet calcule ;)
		 {    temp=i/4;
		      ir=i-4*temp;
		      if(!ir) ir=4;   //Reduc puterea la i%4

		      temp=(long long)pow(i,ir)%10;         //Calculez uc a puterii
		      putere[i]=temp;
		 } else temp=putere[i];
		 uc+=temp;   //Adaug uc la suma
		 uc%=10;
	    }
	    calculat[n]=uc;
	} else uc=calculat[n];
	scrie();
    }
}

int main()
{
    freopen("cifra.out","w",stdout);
    for(int i=0;i<100;i++) calculat[i]=putere[i]=-1;
    rezolva();
    fin.close();
    return 0;
}