Cod sursa(job #3280988)

Utilizator jumaracosminJumara Cosmin-Mihai jumaracosmin Data 28 februarie 2025 00:13:58
Problema Patrate2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <bits/stdc++.h>

#pragma GCC optimize("O2")

std::ifstream fin("patrate2.in");
std::ofstream fout("patrate2.out");

const int size = 1e4;
const int base = 1e5;

int n;
int ans[size];

void exp_mod(int*, int);
void product(int*, int*);
void print(int*);

void read();
void solve();

int main() 
{
    read();
    solve();
    return 0;
}

void read() 
{
    fin >> n;
}

void solve() 
{
    ans[0] = 1;
    ans[1] = 2;
    
    exp_mod(ans, n * n + 1);

    print(ans);
}

void print(int* ans)
{
    fout << ans[ans[0]];
      for(int i = ans[0] - 1; i >= 1; --i)
          fout << std::setfill('0') << std::setw(5) << ans[i];
}

void product(int a[], int b[])
{
    int64_t c[size];
    std::memset(c, 0, sizeof(c));

    for(int i = 1; i <= a[0]; ++i)
        for(int j = 1; j <= b[0]; ++j)
            c[i + j - 1] += (int64_t) a[i] * b[j];

    c[0] = a[0] + b[0] - 1;

    int64_t t = 0;

    for(int i = 1; i <= c[0]; ++i)
    {
        t += c[i];
        c[i] = t % base;
        t /= base;
    }

    while(t)
        c[++c[0]] = t % base, t /= base;

    for(int i = 0; i <= c[0]; ++i)
        a[i] = c[i];
}

void exp_mod(int a[], int n)
{
    int res[size], baza[size], aux[size];
    std::memset(res, 0, sizeof(res));
    res[0] = res[1] = 1;
    std::memcpy(baza, a, sizeof(res));
    
    while(n)
    {
        if(n & 1)
            product(res, baza);

        std::memcpy(aux, baza, sizeof(baza));
        product(baza, aux);
        n /= 2;
    }

    std::memcpy(a, res, sizeof(res));
}