Cod sursa(job #313396)
Utilizator | Nitu Doru Constantin doru.nitu | Data | 8 mai 2009 22:16:11 |
---|---|---|---|
Problema | Factoriale | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.21 kb |
#include<stdio.h>
#include<math.h>
int a[101],i,n,j,k,k1,x,max,i1,b[200];
long long nr;
void mul(int A[], int B)
{
int i, t = 0;
for (i = 1; i <= A[0] || t; i++, t /= 10)
A[i] = (t += A[i] * B) % 10;
A[0] = i - 1;
}
int main()
{ freopen("factoriale.in","r",stdin);
freopen("factoriale.out","w",stdout);
scanf("%d %d",&n,&k);
for(i=1;i<=n;i++) { scanf("%d",&x);
for(j=2;j<=x;j++) ++a[j];
if(x>max) max=x;
}
k1=0;
for(i1=4;i1<=max;i1++) { k1=0;
i=i1;
while(i%2==0) { k1++;
i/=2;
}
a[2]+=k1*a[i1];
x=i;
k1=0;
for(j=3;j<=sqrt(x);j+=2) { while(i%j==0) { k1++;
i/=j;
}
a[j]+=k1*a[i1];
k1=0;
}
x=a[i1];
a[i1]=0;
if(i>1) a[i]+=x;
}
b[0]=1;
b[1]=1;
for(i=2;i<=max;i++) if(a[i]&&a[i]<k) while(a[i]<k) { mul(b,i);
a[i]++;
}
else if(a[i]&&a[i]>k&&a[i]%k!=0) while(a[i]%k!=0) { mul( b,i);
a[i]++;
}
for(i=b[0];i>=1;i--) printf("%d",b[i]);
printf("\n");
fclose(stdin);
fclose(stdout);
return 0;
}