Cod sursa(job #654593)

Utilizator cnt_tstcont teste cnt_tst Data 30 decembrie 2011 17:52:33
Problema Factoriale Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <stdio.h>
FILE *f=fopen("factoriale.in","r");
FILE *g=fopen("factoriale.out","w");
int n,k,s[111],t,p[31],w[101][101];
bool pr[101];

void ciur(){
	for(register int i=2;i<=97;i++){
		if(pr[i]==false){
			p[++t]=i;
			for(register int j=i+i;j<=97;j+=i)
				pr[j]=true;
		}
	}
}

long long up(long long a,int b){
	register long long aux;
	if(b==0)
		return 1;
	else{
		aux=up(a,b/2);
		aux*=aux;
		if(b%2==0)
			return aux;
		else
			return aux*a;
	}
}

int main(void){
	register int i,j,x;
	
	fscanf(f,"%d %d",&n,&k);
	//determinam toate nr prime pe care le memoram in vectorul p(in ordine crescatoare)
	ciur();
	
	//pentru fiecare factorial de la 1 la 100 determinam puterea la care apare fiecare nr prim si le memoram intr-o matrice in care liniile reprezinta nr respectiv,iar coloanele 2,3,5,7... puterea fiecarui nr prim in factorialu sau 
	for(i=2;i<=100;i++){
		x=i;
		for(register int z=1;z<=t;z++){
			w[i][p[z]]=w[i-1][p[z]];
			while(x%p[z]==0){
				x/=p[z];
				w[i][p[z]]++;
			}
		}
	}
	
	//citim nr si calculam pentru fiecare nr prim puterea la care apare in produsul de factoriale,puteri pe care le memoram in vectorul s in coloanele 2,3,5,7...
	for(i=1;i<=n;i++){
		fscanf(f,"%d",&x);
		for(register int z=1;z<=t;z++){
			s[p[z]]+=w[x][p[z]];
		}
	}
	
	//vedem care este diferenta dintre puterea fiecarui nr prim si un multiplu de k si calculam in timp logaritmic acea putere pe care apoi o inmultim cu sol
	long long sol=1;
	for(i=1;i<=t;i++){
		int q=s[p[i]]%k;
		if(q!=0){
			sol*=up(p[i],k-q);
		}
	}
	
	//raspunsul se afla in variabila sol
	fprintf(g,"%lld",sol);
	fclose(f);
	fclose(g);
	return 0;	
}