Cod sursa(job #502222)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 18 noiembrie 2010 15:41:52
Problema Factoriale Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <stdio.h>
#define N 100
#define P 100000
#define NR 10
int fact[N],prim[N],r,rez[P];
int n,k;
char prime(int x)
{
    if (x==1)
        return 0;
    if (x==2)
        return 1;
    if (x%2==0)
       return 0;
    int i;
    for (i=3; i*i<=x; i+=2)
        if (x%i==0)
            return 0;
    return 1;
}
void precalculate()
{
    int i;
    for (i=2; i<=N; i++)
       if (prime(i))
            prim[++r]=i;
}
int cbin(int x)
{
    int st=1,dr=r,m;
    while (st!=dr)
    {
       m=(st+dr)/2;
        if (x<=prim[m])
            dr=m;
        else
            st=m+1;
	}
    if (prim[st]>x)
        --st;
    return st;
}
void actualize(int x,int y)
{
    int nr,numar;
    numar=prim[x];
    nr=prim[x];
    while (nr<=y)
    {
        fact[numar]+=y/nr;
        nr*=numar;
    }
}
void prelucreaza()
{
    int x,i,poz;
   scanf("%d",&x);
    poz=cbin(x);
    for (i=1; i<=poz; i++)
        actualize(i,x);
}
void mul(int A[], int B)
{
      int i, t = 0;
      for (i = 1; i <= A[0] || t; i++, t /= NR)
              A[i] = (t += A[i] * B) % NR;
      A[0] = i - 1;
}
int nrcif(int x)
{
    int cont=0;
    while (x)
    {
        x/=10;
        cont++;
    }
    return cont;
}
int main()
{
    freopen("factoriale.in","r",stdin);
    freopen("factoriale.out","w",stdout);
    precalculate();
    scanf("%d%d",&n,&k);
    int i,j,t;
    for (i=1; i<=n; i++)
        prelucreaza();
    rez[0]=1;
    rez[1]=1;
    for (i=1; i<=r; i++)
    {
        fact[prim[i]]%=k;
        if (fact[prim[i]]!=0)
            for (j=1; j<=k-fact[prim[i]]; j++)
                mul(rez,prim[i]);
    }
    for (i=rez[0]; i>=1; i--)
        printf("%d",rez[i]);
    return 0;
}