Pagini recente » Cod sursa (job #1266044) | Cod sursa (job #238846) | Cod sursa (job #1554077) | Cod sursa (job #419738) | Cod sursa (job #304366)
Cod sursa(job #304366)
#include <iostream>
#include <math.h>
#define NMAX 101
#define MMAX 200
using namespace std;
FILE *f = fopen("factoriale.in", "r"), *g = fopen("factoriale.out", "w");
int **a, *b, *rez, N, K;
int main()
{
a = new int*[NMAX];
a[1] = new int[NMAX];
for (int i = 1; i < NMAX; ++i)
{
a[1][i] = 0;
}
for (int i = 2; i < NMAX; ++i)
{
int j = 2, x = i;
a[i] = new int[NMAX];
for (int j = 1; j < NMAX; ++j)
{
a[i][j] = a[i - 1][j];
}
while (x > 1)
{
while (!(x % j))
{
a[i][j]++;
x = x / j;
}
j++;
}
}
b = new int[NMAX];
for (int i = 1; i < NMAX; ++i)
b[i] = 0;
fscanf(f, "%d %d", &N, &K);
for (int i = 0; i < N; ++i)
{
int x;
fscanf(f, "%d", &x);
for (int j = 1; j < NMAX; ++j)
b[j] = (b[j] + a[x][j]) % K;
}
fclose(f);
for (int i = 1; i < NMAX; ++i)
delete[] a[i];
delete[] *a;
rez = new int[MMAX];
for (int i = 0; i < MMAX; ++i)
{
rez[i] = 0;
}
rez[0] = rez[1] = 1;
for (int i = 2; i < NMAX; ++i)
{
int t = 0;
if (b[i])
{
//B = i * (K - b[i]); B = i la puterea K - b[i]
int *B, k, *C;
B = new int[MMAX];
for (int j = 0; j < MMAX; ++j)
B[j] = 0;
B[0] = B[1] = 1;
for (int j = 1; j <= K - b[i]; ++j)
{
// B = B * i;
t = 0;
for (k = 1; k <= B[0] || t; ++k, t /= 10)
B[k] = (t += B[k] * i) % 10;
B[0] = k - 1;
}
// rez = rez * B
C = new int[MMAX];
memset(C, 0, sizeof(C) * NMAX);
int j;
for (j = 1; j <= rez[0]; j++)
{
for (t = 0, k = 1; k <= B[0] || t; k++, t /= 10)
C[j + k - 1] = (t += C[j + k - 1] + rez[j] * B[k]) % 10;
if (j + k - 2 > C[0]) C[0] = j + k - 2;
}
memcpy(rez, C, sizeof(C) * NMAX);
delete[] B;
delete[] C;
}
}
for (int i = rez[0]; i >= 1; --i)
{
fprintf(g, "%d", rez[i]);
}
fclose(g);
delete[] rez;
delete[] b;
return 0;
}