Cod sursa(job #1361465)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 25 februarie 2015 21:21:13
Problema Factoriale Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include<stdio.h>
#define DIM 10000
FILE *f=fopen("factoriale.in","r"), *g=fopen("factoriale.out","w");

struct Prime{ long int p, nr; } v[30];

long int N, K, sol[DIM+10];

void Initializare(){

    v[1].p=2;   v[2].p=3;   v[3].p=5;   v[4].p=7;   v[5].p=11;  v[6].p=13;  v[7].p=17;
    v[8].p=19;  v[9].p=23;  v[10].p=29; v[11].p=31; v[12].p=37; v[13].p=41; v[14].p=43;
    v[15].p=47; v[16].p=53; v[17].p=59; v[18].p=61; v[19].p=67; v[20].p=71; v[21].p=73;
    v[22].p=79; v[23].p=83; v[24].p=89; v[25].p=97;

}

void Descompunere( long int n ){
long int i, put;

    for(i=1;i<=25;i++){
        put = v[i].p;
        while( n / put >= 1 ) { v[i].nr += n/put; put *= v[i].p; }
    }

}

void Citire(){
long int i, x;

    fscanf(f,"%ld %ld\n",&N,&K); sol[DIM] = 1; sol[0] = 1;
    for(i=1;i<=N;i++){ fscanf(f,"%ld",&x); Descompunere(x); }

}

void Inmultire( long int a ){
long int i, t=0;

    for( i = DIM; i >= DIM - sol[0] + 1; i-- ){
        sol[i] = ( sol[i] * a ) + t;
        t = sol[i]/10; sol[i] %= 10;
    }
    while( t > 0 ){ sol[0]++; sol[ DIM - sol[0] +1 ] = t%10; t/=10; }

}

void Rezolvare(){
long int i, j, a, b;

    for(i=1;i<=25;i++)
        if( v[i].nr % K  != 0 )
            {
                a = v[i].p;
                b = ((v[i].nr / K) + 1) * K - v[i].nr;
                for(j=1;j<=b;j++) Inmultire(a);
            }
}

void Afisare(){
long int i;

    for( i = DIM - sol[0] + 1; i <= DIM; i++ ) fprintf(g,"%ld",sol[i]); fprintf(g,"\n");

}

int main(){

    Initializare();
    Citire();
    Rezolvare();
    Afisare();

return 0;
}