Cod sursa(job #1454020)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 25 iunie 2015 12:05:56
Problema Radix Sort Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>

#define INF (1<<30)
#define mod 666013

using namespace std;
int n, a, b, c, i;
int f[1000005];
vector <int> v[100005];

void cntSort()
{
    //int f[1000005] = {0};
    int i = 0, j = 0;
    int x = b;
    f[b]++;
    for(i = 2; i <= n; i++)
    {
        x = ( 1LL * a * x + (long long)b ) % c;
        f[x]++;
    }
    for(i = 0; i < c; i++)
        while( f[i]-- )
        {
            j++;
            if((j - 1) % 10 == 0)
                printf("%d ", i);
        }
}

void bckSort()
{
    //vector <int> v[100005];
    int elMax = c;
    int bkSize = c / 100000 + 1;
    int o = 0;

    int x = b;
    v[x / bkSize].push_back(x);

    int i = 0;
    for(i = 2; i <= n; i++)
    {
        x = ( 1LL * a * x + (long long)b ) % c;
        v[x / bkSize].push_back(x);
    }

    for(i = 0; i <= 100000; i++)
        if(v[i].size())
        {
            sort(v[i].begin(), v[i].end());
            int j = 0;
            int sz = v[i].size();
            for(j = 0; j < sz; j++)
            {
                o++;
                if(o % 10 == 1)
                    printf("%d ", v[i][j]);
            }
        }
}

int main()
{
    freopen("radixsort.in", "r", stdin);
    freopen("radixsort.out", "w", stdout);
    scanf("%d%d%d%d", &n, &a, &b, &c);

    /*f[1] = b;
    for(i = 2; i <= n; i++)
        f[i] = (a * f[i - 1] + b) % c;

    for(i = 1; i <= n; i += 10)
        printf("%d ", f[i]);

    return 0;*/

    if(c <= 1000000)
        cntSort();
    else
        bckSort();
    return 0;
}