Cod sursa(job #1302440)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 26 decembrie 2014 21:32:05
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <cstdio>

#define MOD 666013
#define Nmax 50010

using namespace std;

int n , i , j , x , SOL;
int t[Nmax] , a[Nmax] , rang[Nmax];

bool sel[Nmax];

int multime(int nod)
{
    if (t[nod] != nod) t[nod] = multime(t[nod]);

    return t[nod];
}

void reuneste(int x , int y)
{
    x = multime(i); y = multime(j);

    if (x == y) return;

    if (rang[x] < rang[y]) t[x] = y;
    else t[y] = x;

    if (rang[x] == rang[y]) rang[x]++;
}

int main()
{
    freopen("autobuze.in","r",stdin);
    freopen("autobuze.out","w",stdout);

    scanf("%d", &n);

    for (i=1;i<=n;++i)
    {
        scanf("%d" , &a[i]);
        t[i] = i;
    }

    for (i=1;i<=n;++i)
     for (j=1;j<=n;++j)
      if (a[i] % a[j] == 0) reuneste(i,j);


    for (i=1;i<=n;++i)
    {
        x = multime(i);
        if (!sel[x]) sel[x] = true , SOL++;
    }

    printf("%d\n", SOL);






    return 0;
}