Cod sursa(job #318143)
Utilizator | Data | 26 mai 2009 23:55:05 | |
---|---|---|---|
Problema | Factoriale | Scor | 30 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.54 kb |
#include <stdio.h>
#include <string.h>
#define Base 10
int prim[323],x,n,k,i,d,e,j,rez[323],p[323],max,pp,rez1[323];
void fact(int a)
{
e=0;
d=2;
while(a%d==0)
{
a/=d;
e++;
}
if (e>0)
prim[d]+=e;
d=3;
while(a!=1)
{
e=0;
while(a%d==0)
{
a/=d;
e++;
}
if (e>0)
prim[d]+=e;
d+=2;
}
}
void init(int cif)
{
p[0]=0;
while (cif)
{
++p[0];
p[p[0]]=cif%Base;
cif/=Base;
}
}
void mul1(int A[], int B)
{
int i, t = 0;
for (i = 1; i <= A[0] || t; i++, t /= Base)
A[i] = (t += A[i] * B) % Base;
A[0] = i - 1;
}
void mul(int A[], int B[])
{
int i, j, t, C[323];
memset(C,0,sizeof(C));
for (i=1;i<=A[0];++i)
{
t=0;
for (j=1;j<=B[0] || t;++j,t/=Base)
C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%Base;
if (i+j-2>C[0]) C[0]=i+j-2;
}
memcpy(A,C,sizeof(C));
}
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)
fact(j);
}
rez[0]=1;
rez[1]=1;
for (i=2;i<=100;++i)
if (prim[i]>0)
{
if (prim[i]%k!=0)
{
pp=1;
//p[0]=p[1]=1;
for (j=1;j<=k-(prim[i]%k);++j)
pp*=i;
//mul1(p,pp);
init(pp);
mul(rez,p);
}
}
//printf("%d", rez[rez[0]]);
for (i=rez[0];i>=1;--i)
printf("%d",rez[i]);
return 0;
}