Pagini recente » Cod sursa (job #800845) | Cod sursa (job #1216691) | Cod sursa (job #1725292) | Cod sursa (job #2471868) | Cod sursa (job #978504)
Cod sursa(job #978504)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NMAX 100000
int A[NMAX], B[NMAX], C[NMAX];
void add(int *a, int *b) {
int i, t = 0;
for (i = 1; i <= a[0] || i <= b[0] || t; i++, t /= 10) {
a[i] = (t += a[i] + b[i]) % 10;
}
a[0] = i - 1;
}
void mul(int *A, int *B)
{
int i, j, t, C[NMAX];
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 logExp(int *a, int n) {
if (n == 0) {
a[0] = 1;
a[1] = 1;
return;
}
if (n == 1)
return;
int t[NMAX];
memcpy(t, a, sizeof(int) * NMAX);
a[0] = 1;
a[1] = 1;
while (1) {
if (n % 2)
mul(a, t);
n /= 2;
if (n == 0)
break;
mul(t,t);
}
}
void number(int n) {
memset(C, 0, NMAX * sizeof(int));
int i = 1;
while (n > 0) {
C[i] = n % 10;
n /= 10;
i++;
}
C[0] = i - 1;
}
void fact(int n) {
B[0] = 1;
B[1] = 1;
int i = 2;
while(i <= n) {
number(i);
i++;
mul(B, C);
}
}
int main() {
freopen("patrate2.in", "r", stdin);
freopen("patrate2.out", "w", stdout);
int i, n;
scanf("%d", &n);
A[0] = 1;
A[1] = 2;
logExp(A, n * n);
fact(n);
mul(A, B);
for (i = A[0]; i > 0; i--)
printf("%d", A[i]);
return 0;
}