Cod sursa(job #2571407)

Utilizator sebastianp2003Popa Sebastian sebastianp2003 Data 4 martie 2020 22:57:31
Problema Radix Sort Scor 30
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("radixsort.in");
ofstream g("radixsort.out");
long long v[10000002], n, maxim, p = 1, t, a[1000 * 1000 * 10 + 2], caz;
long long A, B, C;
void countsort(long long);
int main()
{
    f >> n >> A >> B >> C;
    v[1] = B % C;
    for (long long i = 2; i <= n; i++)
        v[i] = (1ll * A * v[i - 1] % C + B) % C, maxim = max(maxim, v[i]);
    t = log10(maxim);
    for (long long y = 0; y <= t; y++)
        countsort(p), p *= 10;
    if (!caz)
        for (long long i = 1; i <= n; i += 10)
            g << v[i] << " ";
    else
        for (long long i = 1; i <= n; i += 10)
            g << a[i] << " ";
    return 0;
}
void countsort(long long m)
{
    //  g << m << ":  ";
    long long vec[11];
    memset(vec, 0, sizeof vec);
    if (!caz)
    {
        for (long long i = 1; i <= n; i++)
            vec[(v[i] / m) % 10]++;
        /*for (long long i = 0; i <= 9; i++)
            g << vec[i] << " ";
        g << endl;*/
        for (long long i = 1; i <= 9; i++)
            vec[i] += vec[i - 1];
        for (long long i = n; i >= 1; i--)
            a[vec[(v[i] / m) % 10]] = v[i], vec[(v[i] / m) % 10]--;
        /* for (long long i = 1; i <= n; i++)
            g << a[i] << " ";
       // g << endl
        //  << endl;*/
    }
    else
    {
        for (long long i = 1; i <= n; i++)
            vec[(a[i] / m) % 10]++;
        /*for (long long i = 0; i <= 9; i++)
            g << vec[i] << " ";
        g << endl;*/
        for (long long i = 1; i <= 9; i++)
            vec[i] += vec[i - 1];
        for (long long i = n; i >= 1; i--)
            v[vec[(a[i] / m) % 10]] = a[i], vec[(a[i] / m) % 10]--;
        /*  for (long long i = 1; i <= n; i++)
            g << v[i] << " ";
        g << endl
          << endl;*/
    }
    caz ^= 1;
}