Cod sursa(job #1885616)

Utilizator GhSamuelGherasim Teodor-Samuel GhSamuel Data 20 februarie 2017 09:45:07
Problema Factoriale Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
FILE * f = fopen("factoriale.in", "r");
FILE * g = fopen("factoriale.out", "w");
int factor[25], v[10001];
int prim[] = {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};

using namespace std;

void desc(int n)
{
    int nr;
    for (int i = 0; i < 25; ++i)
        factor[i] = 0;

    for(int i = 0; i < n; ++i) {
        fscanf(f, "%d", &nr);
        for (int i = 0; i < 25; ++i)
            for (int j = prim[i]; j <= nr; j *= prim[i])
            factor[i] += nr / j;
    }
}

void inmultire(int j, int &cnt)
{
    int T = 0;

    while(factor[j]) {
    for (int i = 1000; i > 1000 - cnt; --i) {
        v[i] = v[i] * prim[j] + T;
        T = v[i] / 10;
        v[i] = v[i]%10;
    }
    int i = 1000 - cnt;
    while (T) {
        v[i] = T % 10;
        ++cnt;
        --i;
        T /= 10;
    }
    --factor[j];
    }
}

void rezolvare(int k)
{
    int cnt = 1;
    v[1000] = 1;
    for (int i = 0; i < 25; ++i) {
    if (factor[i]) {
        if (factor[i] % k == 0)
            factor[i] = 0;
        else
            factor[i] = k - factor[i] % k;
    }
    inmultire(i, cnt);
    }

    for (int i = 1000 - cnt + 1; i < 1001; ++i)
        fprintf(g, "%d", v[i]);
}


int main()
{
    int n, k;
    fscanf(f, "%d%d", &n, &k);
    desc(n);
    rezolvare(k);
    return 0;
}