Cod sursa(job #3343075)

Utilizator Anul2024Anul2024 Anul2024 Data 26 februarie 2026 14:12:14
Problema Poligon Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.95 kb
#include <fstream>
using namespace std;
ifstream fin ("bubblesort.in");
ofstream fout ("bubblesort.out");
const int DIM = 500;
struct nr_mari
{
    long long v[DIM + 1];
    nr_mari ()
    {
        for (int i = 0; i <= DIM; i++)
            v[i] = 0;
    }
    void constr (int x)
    {
        v[0] = 1;
        v[1] = x;
    }
    friend nr_mari operator + (nr_mari &a, nr_mari &b)
    {
        nr_mari c;
        int i = 0;
        long long t=0;
        for (i = 1; i <= a.v[0] || i <= b.v[0]; i++)
        {
            c.v[i] = a.v[i] + b.v[i] + t;
            t = c.v[i] / 10;
            c.v[i] = c.v[i] % 10;
        }
        c.v[0] = i - 1;
        if (t > 0)
        {
            c.v[0] = i;
            c.v[i] = t;
        }
        return c;
    }
    friend bool operator < (nr_mari &a, nr_mari &b)
    {
        if (a.v[0] < b.v[0])
            return 1;
        if (a.v[0] > b.v[0])
            return 0;
        for (int i = a.v[0]; i > 0; i--)
        {
            if (a.v[i] < b.v[i])
                return 1;
            if (a.v[i] > b.v[i])
                return 0;
        }
        return 0;
    }
    friend nr_mari operator - (nr_mari &a, nr_mari &b)
    {
        nr_mari c;
        long long t = 0;
        int i = 0;
        for (i = 1; i <= a.v[0]; i++)
        {
            if (a.v[i] - t < b.v[i])
            {
                c.v[i] = 10 + a.v[i] - b.v[i] - t;
                t = 1;
            }
            else
            {
                c.v[i] = a.v[i] - b.v[i] - t;
                t = 0;
            }
        }
        c.v[0] = a.v[0];
        while (c.v[0] > 1 && c.v[c.v[0]] == 0)
            c.v[0]--;
        return c;
    }
    friend nr_mari operator / (nr_mari &a, int x)
    {
        nr_mari c;
        c.v[0] = a.v[0];
        int i = 0;
        long long r = 0;
        for (i = a.v[0]; i > 0; i--)
        {
            r = r * 10 + a.v[i];
            c.v[i] = r / x;
            r = r % x;
        }
        while (c.v[0] > 1 && c.v[c.v[0]] == 0)
            c.v[0]--;
        if (r != 0)
        {
            i = 1;
            while (c.v[i] == 9)
            {
                c.v[i] = 0;
                i++;
            }
            c.v[i]++;
            if (i > c.v[0])
                c.v[0]++;
        }
        return c;
    }
    friend nr_mari operator * (nr_mari &a, int y)
    {
        int i = 0;
        long long t = 0;
        for (i = 1; i <= a.v[0]; i++)
        {
            long long k = 1ll * a.v[i] * y + t;
            a.v[i] = k % 10;
            t = k / 10;
        }
        while (t != 0)
        {
            a.v[0]++;
            a.v[a.v[0]] = t % 10;
            t = t / 10;
        }
        return a;
    }
    void afis ()
    {
        int i;
        fout << v[v[0]];
        for (i = v[0]; i > 0; i--)
        {
            fout<<v[i];
        }
    }
};
void calc (nr_mari &pm, int n, int m)
{
    if (m == 0)
        pm.init (0);
    else
    {
        pm.init (1);
        for (int i = 1; i <= n - m + 1; i++)
            pm *= m;
        for (int i = 1; i <= m; i++)
            pm *= i;
    }
}
void init ()
{
    fin >> n >> m >> k;
    calc (pm, n, m); 
    calc (pm_1, n, m - 1);
}
void solve ()
{
    fin >> n >> m >> k;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            if (!in_p[j])
            {
                valm = calc_val (j);
                valm_1 = calc_val (j);
                val = valm - valm_1;
                if (k > val)
                    k -= val;
                else
                {
                    sol[i] = j;
                    in_p[j] = 1;
                    break;
                }
            }
        }
    }
}
void print ()
{
    for (int i = 1; i <= n; i++)
        fout << sol[i];
}
int main ()
{
    init ();
    solve ();
    print ();
    return 0;
}