Pagini recente » Cod sursa (job #2630189) | Cod sursa (job #881940) | Cod sursa (job #543356) | Cod sursa (job #102549) | Cod sursa (job #690692)
Cod sursa(job #690692)
#include <fstream>
#include <cstring>
using namespace std;
int N, M, i, j, m[50][3500], factorial[3500], x;
void Citire ()
{
ifstream fin ("patrate2.in");
fin >> N;
fin.close ();
}
void Inmultire (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;
}
void Aflare ()
{
factorial[0] = 1;
factorial[1] = 1;
for (i = 2; i <= N; i++)
{
Inmultire (factorial, i);
}
}
void mul (int A[], int B[])
{
int i, j, t, C[3500];
memset (C, 0, sizeof(C));
for (i = 1; i <= A[0]; i++)
{
for (t = 0, j = 1; j <= B[0] || t; j++, t /= 10)
C[i + j - 1] = (t += C[i + j - 1] + A[i] * B[j]) % 10;
if (i + j - 2 > C[0]) C[0] = i + j - 2;
}
memcpy(A, C, sizeof(C));
}
void Ridicare ()
{
M = N * N;
m[0][0] = 1;
m[0][1] = 1;
m[1][0] = 1;
m[1][1] = 2;
x = 2;
for (i = 2; x <= M; i++, x *= 2)
{
memcpy (m[i], m[i - 1], sizeof (m[i - 1]));
mul (m[i], m[i - 1]);
}
x /= 2;
for (j = i - 1; j >= 0 && M > 0; j--, x /= 2)
{
if (M >= x)
{
mul (factorial, m[j]);
M -= x;
}
}
}
int main ()
{
Citire ();
ofstream fout ("patrate2.out");
if (N == 1)
{
fout << "1";
fout.close ();
return 0;
}
if (N < 50) N /= 0;
Aflare ();
Ridicare ();
for (j = factorial[0]; j >= 1; j--)
{
fout << factorial[j];
}
fout.close ();
return 0;
}