Cod sursa(job #431127)

Utilizator nandoLicker Nandor nando Data 31 martie 2010 18:21:45
Problema Factoriale Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>

using namespace std;

#define MAX 1000
#define BASE 10

typedef int Huge[1000];

void AtribValue(Huge H, unsigned long X){
	H[0] = 0;
    while (X) {
		++H[0];
		H[H[0]] = X % BASE;
		X /= BASE;
	}
}

void Mult(Huge H, unsigned long X){
	int i;
	unsigned long T=0;

    for (i=1;i<=H[0];i++){
		H[i]=H[i]*X+T;
		T=H[i]/10;
		H[i]=H[i]%10;
	}
	while (T){
		H[++H[0]]=T%10;
		T/=10;
	}
}

int decomp[MAX],n,k,nr[MAX];

FILE* fin=fopen("factoriale.in","r");
FILE* fout=fopen("factoriale.out","w");

int main(){
	fscanf(fin,"%d %d",&n,&k);
	nr[0]=1;
	for(int i=1;i<=n;i++){
		fscanf(fin,"%d ",&nr[i]);
	}
	sort(nr+1,nr+n+1);
	int maxd=1;
	for(int i=0;i<n;i++){
		for(int j=nr[i]+1;j<=nr[i+1];j++){
			int tmp=j,d=2;
			while(tmp>1){
				while(tmp%d==0){
					tmp/=d,decomp[d]+=n-i;
				}
				d++;
				if(d>maxd){
					maxd=d;
				}
			}
		}
	}
	
	Huge res;
	AtribValue(res,1);

	for(int i=2;i<=maxd;i++){
		if(decomp[i]%k!=0){
			int d=k-decomp[i]%k;
			while(d>0){
				Mult(res,i),d--;
			}
		}
	}
	for(int i=res[0];i>0;i--){
		fprintf(fout,"%d",res[i]);
	}
	fclose(fin);
	fclose(fout);
	return 0;
}