Pagini recente » Cod sursa (job #1724668) | Cod sursa (job #1290354) | Cod sursa (job #406424) | Cod sursa (job #1636555) | Cod sursa (job #812849)
Cod sursa(job #812849)
#include <cassert>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 105;
const int NRC = 1500;
const int BASE = 10000;
int n;
int power[NRC], fact[NRC], c[NRC];
void mult(int a[], int b)
{
int i, t = 0;
for (i = 1; i <= a[0] || t; ++i, t /= BASE)
a[i] = (t += a[i] * b) % BASE;
a[0] = i - 1;
}
void mult2(int a[], int b[]) {
int i, j, t;
memset(c, 0, sizeof(c));
for (i = 1; i <= a[0]; ++i) {
for (t = 0, j = 1; j <= b[0] || t; ++j, t/= BASE)
c[i + j - 1] = (t += c[i + j - 1] + a[i] * b[j]) % BASE;
if (i + j - 2 > c[0])
c[0] = i + j - 2;
}
memcpy(a, c, sizeof(c));
}
void calcFact(int n)
{
fact[0] = fact[1] = 1;
for (int i = 2; i <= n; ++i)
mult(fact, i);
}
void calc_power(int x, int y)
{
if (y == 0) {
// mult(power, 2);
return;
}
if (!(y & 1)) {
calc_power(x, y / 2);
mult2(power, power);
}
else {
calc_power(x, y - 1);
mult2(power, power);
mult(power, 2);
}
}
void print(int a[]) {
printf("%d", a[a[0]]);
for (int i = a[0] - 1; i >= 1; --i)
printf("%.4d", a[i]);
}
int main()
{
assert(freopen("patrate2.in", "r", stdin) != NULL);
assert(freopen("patrate2.out", "w", stdout) != NULL);
assert(scanf("%d", &n) == 1);
calcFact(n);
power[0] = power[1] = 1;
calc_power(2, n * n);
mult2(power, fact);
print(power);
return 0;
}