Cod sursa(job #2873801)

Utilizator andreifilimonPopescu Filimon Andrei Cosmin andreifilimon Data 19 martie 2022 11:40:49
Problema Factoriale Scor 80
Compilator c-64 Status done
Runda concursceva1 Marime 2.52 kb
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define MAXLOG10 10
#define BUFSIZE (128 * 1024)
FILE *fin, *fout;
/*int p10[MAXLOG10 + 1] = { 0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
int rpos;
char rbuf[BUFSIZE];
int wpos;
char wbuf[BUFSIZE];

static inline void initRead()
{
    rpos=BUFSIZE-1;
}
static inline char readChar()
{
    if(!(rpos=(rpos+1) & (BUFSIZE-1)))
        fread(rbuf, 1, BUFSIZE, fin);
    return rbuf[rpos];
}
int readInt()
{
    int ch, res=0, semn=1;
    while(isspace(ch=readChar()));
    if(ch=='-')
    {
        semn=-1;
        ch=readChar();
    }
    do
        res=10*res+ch-'0';
    while(isdigit(ch=readChar()));

    return semn*res;
}
static inline void initWrite()
{
    wpos=0;
}
static inline void writeChar(char ch)
{
    wbuf[wpos]=ch;
    if(!(wpos=(wpos+1) & (BUFSIZE-1)))
        fwrite(wbuf, 1, BUFSIZE, fout);
}
void writeInt(int x)
{
    int i,cf;

    if(x<0)
    {
        writeChar('-');
        x=-x;
    }
    i=MAXLOG10;
    while(p10[i]>x)
        i--;
    if(i==0)
        writeChar('0');
    else
        do
        {
            cf='0';
            while(p10[i]<=x)
            {
                x-=p10[i];
                cf++;
            }
            writeChar(cf);
        }
        while(--i>0);
}

static inline void flushBuf()
{
    fwrite(wbuf, 1, wpos, fout);
}*/

int n, k;
int x[101], f[26], rez[1000];
int prim[27]= {0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101};

void descomp(int x)
{
    int i, j, k;
    for(i=1; i<=26 && prim[i]<=x; i++)
    {
        j=k=prim[i];
        while(k<=x)
        {
            f[i]+=x/k;
            k*=j;
        }
    }
}
void inmult(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()
{
    fin=fopen("factoriale.in","r");
    fout=fopen("factoriale.out","w");
    int i, j;
    //initRead();
    //n=readInt();
    //k=readInt();
    fscanf(fin,"%d%d",&n,&k);
    rez[1]=rez[0]=1;
    for(i=1; i<=n; i++)
    {
        fscanf(fin,"%d",x+i);
        descomp(x[i]);
    }
    for(i=1; i<=26; i++)
    {
        if(f[i]%k!=0)
            for(j=f[i]%k; j<k; j++)
                inmult(rez,prim[i]);
    }
    //initWrite();
    for(i=rez[0]; i>=1; i--)
        fprintf(fout,"%d",rez[i]);
    fclose(fin);
    //flushBuf();
    fclose(fout);
    return 0;
}