Cod sursă (job #432337)

Utilizator avatar ezioconnor Vlad - Gabriel Iftimescu ezioconnor IP ascuns
Problemă 2sah (clasele 11-12) Compilator cpp | 1,24 kb
Rundă Arhiva de probleme Status evaluat
Dată 8 feb. 2019 12:38:03 Scor 100
#include <fstream>
#define MOD 100003

using namespace std;

ifstream in("2sah.in");
ofstream out("2sah.out");

typedef long long mat3[3][3];

void mul(mat3 a, mat3 b, mat3 c)
{
    for (int i = 0; i < 3; ++i)
    {
        for (int j = 0; j < 3; ++j)
        {
            c[i][j] = 0;
            for (int k = 0; k < 3; ++k)
                c[i][j] += a[i][k] * b[k][j];
        }
    }
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
            a[i][j] = c[i][j] % MOD;
    }
}

int main()
{
    int t, n, k;
    in >> t >> n >> k;
    if (t == 1)
    {
        --k;
        long long answer = 1, pow = 3;
        while (k)
        {
            if (k & 1)
                answer = (answer * pow) % MOD;
            pow = pow * pow % MOD;
            k >>= 1;
        }
        out << answer;
    }
    else
    {
        k = n + 1 - k;
        mat3 pow = { { 0, 1, 0 }, { 0, 0, 1 }, { 1, 1, 1 } };
        mat3 ans = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } };
        mat3 tmp;
        while (k)
        {
            if (k & 1)
                mul(ans, pow, tmp);
            mul(pow, pow, tmp);
            k >>= 1;
        }
        out << ans[2][2];
    }
    return 0;
}