Cod sursa(job #2359990)

Utilizator AndreiVisoiuAndrei Visoiu AndreiVisoiu Data 1 martie 2019 11:15:36
Problema Patrate2 Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("patrate2.in");
ofstream out("patrate2.out");

const int BAZA = 10000;

struct nrM {
    int s[1500];

    void print() {
        out << s[s[0]];
        for(int i = s[0]-1; i >= 1; i--)
            out << setw(4) << 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;
}