Pagini recente » Cod sursa (job #311796) | Cod sursa (job #2713260) | Cod sursa (job #910474) | Cod sursa (job #365376) | Cod sursa (job #2359994)
#include <bits/stdc++.h>
using namespace std;
ifstream in("patrate2.in");
ofstream out("patrate2.out");
const int BAZA = 100000;
struct nrM {
unsigned long long s[1000];
void print() {
out << s[s[0]];
for(int i = s[0]-1; i >= 1; i--)
out << setw(5) << setfill('0') << s[i];
}
};
nrM u, z, F, P, S;
nrM prod(const nrM& a, int b) {
nrM c = z;
int T = 0;
c.s[0] = a.s[0];
for(int i = 1; i <= c.s[0]; i++) {
T += a.s[i] * b;
c.s[i] = T % BAZA;
T /= BAZA;
}
while(T > 0) {
c.s[++c.s[0]] = T % BAZA;
T /= BAZA;
}
return c;
}
nrM mProd(const nrM& a, const nrM& b) {
nrM c = z;
c.s[0] = a.s[0] + b.s[0] - 1;
int T = 0;
for(int i = 1; i <= a.s[0]; i++)
for(int j = 1; j <= b.s[0]; j++)
c.s[i+j-1] += a.s[i] * b.s[j];
for(int i = 1; i <= c.s[0]; i++) {
T = (c.s[i] += T) / BAZA;
c.s[i] %= BAZA;
}
if(T) c.s[++c.s[0]] = T;
return c;
}
nrM lgPow(const nrM& a, int P) {
nrM c = u, s = a;
for(int i = 0; (1LL << i) <= P; i++) {
if(P & (1LL << i))
c = mProd(c, s);
s = mProd(s, s);
}
return c;
}
int main()
{
int N;
in >> N;
u.s[0] = u.s[1] = 1;
F = u;
P.s[0] = 1, P.s[1] = 2;
P = lgPow(P, N*N);
for(int i = 2; i <= N; i++)
F = prod(F, i);
S = mProd(F, P);
S.print();
return 0;
}